Логика чтения XML-файла в vb.net

У меня есть файл XML, который я пытаюсь прочитать и переписать (для последующих манипуляций) в новый текстовый файл с помощью vb.net.

Я могу успешно прочитать XML и распечатать его, но у меня возникают проблемы с правильным определением начального и конечного тегов каждого элемента/атрибута.

Я использую xmlNodeReader для чтения документа, получая имя и значение каждого чтения. Затем выберите случай с xmlNodeType.Element или xmlNodeType.EndElement

Как мне получить правильную логику для решения этой проблемы, поскольку некоторые строки XML имеют форму <Server Type="PropertyDefinitions">, а другие - форму <Server Type="aServerName"/>

Среди прочего я пробовал цикл if для endEntity, но, похоже, ничего не сработало. Вот (часть) моего кода, который показывает функцию чтения и записи. Если я не предоставил достаточно информации, пожалуйста, дайте мне знать.

     Dim reader As XmlNodeReader = New XmlNodeReader(document)
     Dim result As New StringBuilder
      While reader.Read
        Select Case reader.NodeType

            Case XmlNodeType.Element
            result.Append("<" & reader.Name)

                    If reader.HasAttributes Then
                        While reader.MoveToNextAttribute()
                            result.Append(" " + reader.Name + "=" + Chr(34) + reader.Value + Chr(34))
                        End While

                        If XmlNodeType.EndEntity Then
                            result.Append("/>")
                        End If
                    Else
                        If XmlNodeType.Entity Then
                            result.Append(">")
                        ElseIf XmlNodeType.EndEntity Then
                            result.Append("/>")
                        End If
                    End If

            Case XmlNodeType.EndElement
                result.Append("</" + reader.Name + ">")

        End Select
    End While

Пример образца XML, который показывает 3 различных типа тегов:

    <DocumentSMG Version="6.900000" VersionSeemage="6.12.0.2428">
     <Server Type="PropertyDefinitions">
        <MetaProperties>
        </MetaProperties>
     </Server>
      <Server Type="aServerType1">
        <BOM.Sort.Ascendant Value="1"/>
     </Server>
      <Server Type="aServerType2"/>
      <Server Type="aServerType3"/>
    </DocumentSMG>

person JS16    schedule 10.06.2016    source источник
comment
Есть ли причина, по которой вы не используете XmlDocument? Это позволит вам сохранить все изменения, не записывая xml самостоятельно.   -  person the_lotus    schedule 10.06.2016


Ответы (2)


Попробуй это

Imports System.Xml
Imports System.Xml.Linq
Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim reader As XmlReader = XmlReader.Create(FILENAME)

        While Not reader.EOF
            If reader.Name <> "Server" Then
                reader.ReadToFollowing("Server")
            End If
            If Not reader.EOF Then
                Dim server As XElement = XElement.ReadFrom(reader)
                Dim type As String = server.Attribute("Type")
                Select Case type
                    Case "PropertyDefinitions"

                    Case "aServerType1"

                    Case "aServerType2"

                    Case "aServerType3"

                End Select

            End If

        End While



    End Sub

End Module
person jdweng    schedule 10.06.2016

Вместо этого я бы рекомендовал вам попробовать использовать для этого класс XDocument и Linq. Используя этот XML (XMLFile.xml):

<?xml version="1.0" encoding="utf-8" ?>
<DocumentSMG Version="6.900000" VersionSeemage="6.12.0.2428">
  <Server Type="PropertyDefinitions">
    <MetaProperties>
    </MetaProperties>
  </Server>
  <Server Type="aServerType1">
    <BOM.Sort.Ascendant Value="1"/>
  </Server>
  <Server Type="aServerType2"/>
  <Server Type="aServerType3"/>
</DocumentSMG>

Вы можете прочитать документ следующим образом:

Dim xml = XDocument.Load("XMLFile.xml")

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

Dim serverNodes = xml...<Server>.Where(Function(node) node.@Type = "aServerType1")

... является псевдонимом свойства "Наследники" @ обозначает атрибут

Таким образом, приведенный выше поиск ищет узлы, которые являются потомками корня документа с атрибутом Type, содержащим «aServerType1».

Вы также можете изменить значения непосредственно в XDocument, а затем сохранить его.

Чтобы сохранить документ:

xml.Save("NewXMLFile.xml")
person Drunken Code Monkey    schedule 10.06.2016