XML добавление в текущий XML-файл - PullRequest
1 голос
/ 10 января 2012

Я с трудом пытаюсь добавить созданный мной XML-файл. В настоящее время это код, который я должен создать файл XML:

 Dim myXmlTextWriter As New XmlTextWriter("d:\doc.xml", Nothing)

 With myXmlTextWriter
        .Formatting = Formatting.Indented
        .Indentation = 3
        .IndentChar = " "

        .WriteStartDocument()
        .WriteComment("Data for 3030")
        .WriteStartElement("3030")
        .WriteElementString("jod", "364887")
        .WriteElementString("aag_SN", "782 YvV0007")
        .WriteElementString("te", "9.03")

        .WriteEndElement()
        .Close()
 End With

Каждый раз, когда я запускаю этот код, он просто перезаписывает существующие данные. Как я могу добавить к существующим данным и при этом иметь такую ​​же структуру? Я не могу выполнить цикл для всех своих данных, потому что пользователь каждый раз что-то заполняет и не может двигаться дальше, пока он не будет сохранен первым.

Вот пример того, что я ищу:

 <?xml version="1.0"?>
 <!--Data for 3030-->
 <3030>
    <jod>364887</jod>
    <aag_SN>782 YvV0007</aag_SN>
    <te>9.03</te>
    <jod>364337</jod>
    <aag_SN>782 Y089702</aag_SN>
    <te>5.00</te>
    <jod>32687</jod>
    <aag_SN>782 YFd3407</aag_SN>
    <te>2.43</te>
    <jod>39007</jod>
    <aag_SN>782 Yv75407</aag_SN>
    <te>3.03</te>
 </3030>

Так что мне нужно читать значения каждый раз, когда я запускаю новую вставку, но я не могу найти код, чтобы сделать то, что мне нужно в данный момент.

Любая помощь будет отличной!

David

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Глядя на этот вопрос Daniweb один из ответов, кажется, работает. Он предлагает создать FileStream самостоятельно с опцией добавления, а затем использовать этот поток при создании XmlTextWriter. Вам нужно проверить, существует ли файл, чтобы писать XmlHeader только один раз.

Dim writeStart As Boolean
If Not IO.File.Exists("C:\temp\doc.xml") Then writeStart = True
Dim xmlFile As IO.FileStream = New IO.FileStream("c:\temp\doc.xml", IO.FileMode.Append)
Dim myXmlTextWriter As New XmlTextWriter(xmlFile, System.Text.Encoding.Default)

With myXmlTextWriter
    .Formatting = Formatting.Indented
    .Indentation = 3
    .IndentChar = CChar(" ")
    If writeStart Then .WriteStartDocument()
    .WriteComment("Data for 3030")
    .WriteStartElement("3030")
    .WriteElementString("jod", "364887")
    .WriteElementString("aag_SN", "782 YvV0007")
    .WriteElementString("te", "9.03")
    .WriteFullEndElement()
    .Close()
End With

Я внес некоторые изменения из-за множественного корневого объекта, читатель xmlDocument также жалуется на ваши теги, начинающиеся с цифры, т. Е. «3030», поэтому я добавил символ альфа. Я использую XmlTextWriter только для создания файла:

Dim writeStart As Boolean
If Not IO.File.Exists("C:\temp\doc.xml") Then writeStart = True

Dim xmlFile As IO.FileStream = New IO.FileStream("c:\temp\doc.xml", IO.FileMode.Append)
Dim myXmlTextWriter As New XmlTextWriter(xmlFile, System.Text.Encoding.Default)
If writeStart Then
    With myXmlTextWriter
        .Formatting = Formatting.Indented
        .Indentation = 3
        .IndentChar = CChar(" ")
        .WriteStartDocument()
        .WriteStartElement("root")
        .WriteEndElement()
    End With
End If
myXmlTextWriter.Close()

AddXmlData("c:\temp\doc.xml", "a3030", "364887", "782 YvV0007", "9.03")

Добавить Я использую этот Sub для добавления ваших данных:

Private Sub AddXmlData(xmlfile As String, index As String, jod As String, aag_SN As String, te As String)
    Dim myXmlDocument As New XmlDocument
    Dim myNodes, myChildren As XmlNodeList
    Dim node(3) As XmlNode

    myXmlDocument.Load(xmlfile)
    myNodes = myXmlDocument.GetElementsByTagName("root")

    For Each n As XmlNode In myNodes
        If n.Name = "root" Then
            myChildren = n.ChildNodes
            For Each n1 As XmlNode In myChildren
                If n1.Name = index Then
                    node(1) = myXmlDocument.CreateNode(System.Xml.XmlNodeType.Element, "jod", "")
                    node(2) = myXmlDocument.CreateNode(System.Xml.XmlNodeType.Element, "aag_SN", "")
                    node(3) = myXmlDocument.CreateNode(System.Xml.XmlNodeType.Element, "te", "")
                    node(1).InnerText = jod
                    node(2).InnerText = aag_SN
                    node(3).InnerText = te
                    n1.AppendChild(node(1))
                    n1.AppendChild(node(2))
                    n1.AppendChild(node(3))
                    myXmlDocument.Save(xmlfile)
                    Exit Sub
                End If
            Next
            node(0) = myXmlDocument.CreateNode(XmlNodeType.Element, index, "")
            node(1) = myXmlDocument.CreateNode(System.Xml.XmlNodeType.Element, "jod", "")
            node(2) = myXmlDocument.CreateNode(System.Xml.XmlNodeType.Element, "aag_SN", "")
            node(3) = myXmlDocument.CreateNode(System.Xml.XmlNodeType.Element, "te", "")
            node(1).InnerText = jod
            node(2).InnerText = aag_SN
            node(3).InnerText = te
            node(0).AppendChild(node(1))
            node(0).AppendChild(node(2))
            node(0).AppendChild(node(3))
            n.AppendChild(node(0))
            myXmlDocument.Save(xmlfile)
        End If
    Next
End Sub

Что создает xmlDocument, похожий на это:

<?xml version="1.0" encoding="Windows-1252"?>
<root>
  <a3030>
    <jod>364887</jod>
    <aag_SN>782 YvV0007</aag_SN>
    <te>9.03</te>
    <jod>364887</jod>
    <aag_SN>782 YvV0007</aag_SN>
    <te>9.03</te>
    <jod>364887</jod>
    <aag_SN>782 YvV0007</aag_SN>
    <te>9.03</te>
    <jod>364887</jod>
    <aag_SN>782 YvV0007</aag_SN>
    <te>9.03</te>
  </a3030>
</root>
0 голосов
/ 10 января 2012

Вы должны переписать весь файл.В конце концов, это просто текстовый файл.

Если данные небольшие, может быть проще использовать XmlDocument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...