2009-04-20 140 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> 

我的hve发送的button.On我要追加Enail节点和correponding每次点击该按钮childnodes到现有的xml文件。 在发送buttonclick我写了下面的代码。

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

您是指在一个XMLFile中有多个EMails,或者您是否添加了一个新字段?此外,如果此文件需要广泛使用,则可能需要正确拼写收件人。 – Mark 2009-04-20 06:44:54

+0

是的,多个EMail在一个XML文件中 – user42348 2009-04-20 06:46:27

回答

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 

编辑:

这需要错误处理等,但应该为你工作。在某些情况下,它将会中断(例如,如果文件存在但是为空),您需要自行解决这些问题。

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