2009-04-20 11 views
0

Ниже мой XML-файл кодаКак добавить новый узел в существующий узел в XML

<XMLFile> 
<EMail> 
<From> 
    <Address>[email protected]</Address> 
</From> 
<Receipent> <To>[email protected]</To> </Receipent> 
    <Subject>fffffsadasd</Subject> 
    <Body>ggggasdsd</Body> 
    </EMail> 
    </XMLFile> 

я посланный ВПО button.On нажав на эту кнопку каждый раз, когда я хочу, чтобы добавить узел Enail и correponding childnodes в существующий xml-файл. В послано buttonclick i hve написано следующий код.

Dim currNode As XmlNode 
     Dim doc As New XmlDocument 


     doc.LoadXml(("<XMLFile>" + " <EMail></EMail>" + "</XMLFile>")) 
     Dim docFrag As XmlDocumentFragment = doc.CreateDocumentFragment() 
     docFrag.InnerXml = "<From>" + " <Address>" + txtFrom.Text + " </Address>" + "</From>" 
     currNode = doc.DocumentElement.FirstChild 
     currNode.InsertAfter(docFrag, currNode.LastChild) 

     docFrag.InnerXml = "<Receipent>" + " <To>" + txtTo.Text + " </To>" + "</Receipent>" 
     currNode = doc.DocumentElement.FirstChild 
     currNode.InsertAfter(docFrag, currNode.LastChild) 

     docFrag.InnerXml = "<Subject>" + txtSubject.Text + "</Subject>" 
     currNode = doc.DocumentElement.FirstChild 
     currNode.InsertAfter(docFrag, currNode.LastChild) 

     docFrag.InnerXml = "<Body>" + txtBody.Text + "</Body>" 
     currNode = doc.DocumentElement.FirstChild 
     currNode.InsertAfter(docFrag, currNode.LastChild) 

     doc.Save("C:\xmlmailfile.xml") 

Какие изменения я должен сделать в кнопку мыши

+0

Вы имеете в виду несколько EMails в одном XMLFile или вы добавляете новое поле? Кроме того, вы можете захотеть правильно начертить Получателя, если этот файл используется для широкого использования. – Mark

+0

Да, несколько EMails в одном XMLFile – user42348

+0

Для всех, кто интересуется этим вопросом, он развивается из этого: http://stackoverflow.com/questions/763177/concerned-with-writing-xml/ – Cerebrus

ответ

2

Что-то, как это должно сделать это. XmlTextWriter может быть лучше для ваших целей, хотя:

Private Function GenerateXML(ByVal emails As List(Of Email)) As String 

    Dim sb As New System.Text.StringBuilder 

    Using sw As New IO.StringWriter(sb), xt As New Xml.XmlTextWriter(sw) 

     xt.WriteStartElement("xmlDoc") 

     For i As Integer = 0 To emails.Count - 1 

      xt.WriteStartElement("email") 

      xt.WriteStartElement("From") 
      xt.WriteElementString("address", emails(i).From) 
      xt.WriteEndElement() 

      xt.WriteStartElement("Receipent") 
      xt.WriteElementString("to", emails(i).Recipient) 
      xt.WriteEndElement() 

      xt.WriteElementString("subject", emails(i).Subject) 
      xt.WriteElementString("body", emails(i).Body) 

      xt.WriteEndElement() 

     Next 

     xt.WriteEndElement() 

    End Using 

    Return sb.ToString 

End Function 

EDIT: обработка

Эта потребность ошибки и т.д., но они должны работать для вас. Есть случаи, когда он будет разбит (например, если файл существует, но пуст), который вам нужно будет решить самостоятельно.

Module consoleTestApp 

    Private _path As String = "c:\output.xml" 

    //Just pretend these are text boxes 
    Public txtFrom As String 
    Public txtRecipient As String 
    Public txtSubject As String 
    Public txtBody As String 

    Sub Main() 

     txtFrom = "from1" 
     txtRecipient = "rec1" 
     txtSubject = "subj1" 
     txtBody = "body1" 

     AddNewEmail() 

     txtFrom = "from2" 
     txtRecipient = "rec2" 
     txtSubject = "subj2" 
     txtBody = "body2" 

     AddNewEmail() 

    End Sub 

    Private Sub AddNewEmail() 

     If Not IO.File.Exists(_path) Then 

      Using xt As New Xml.XmlTextWriter(_path, System.Text.Encoding.UTF8) 

       xt.WriteStartElement("xmlDoc") 
       xt.WriteEndElement() 

      End Using 

     End If 

     Dim xD As New Xml.XmlDocument 
     xD.Load(_path) 

     Dim xN As Xml.XmlNode = xD.CreateNode(Xml.XmlNodeType.Element, String.Empty, "email", String.Empty) 
     xN.InnerXml = GenerateXML() 

     xD.SelectSingleNode("//xmlDoc").AppendChild(xN) 
     xD.Save(_path) 


    End Sub 

    Private Function GenerateXML() As String 

     Dim sb As New System.Text.StringBuilder 

     Using sw As New IO.StringWriter(sb), xt As New Xml.XmlTextWriter(sw) 

      xt.WriteStartElement("From") 
      xt.WriteElementString("address", txtFrom) 
      xt.WriteEndElement() 

      xt.WriteStartElement("Receipent") 
      xt.WriteElementString("to", txtRecipient) 
      xt.WriteEndElement() 

      xt.WriteElementString("subject", txtSubject) 
      xt.WriteElementString("body", txtBody) 

     End Using 

     Return sb.ToString 

    End Function 

End Module 
+0

Это. Смешение жестко закодированных XML и XMLNode не очень хорошо. – Mark

Смежные вопросы