【问题标题】:Logic to reading an XML file in vb.net在 vb.net 中读取 XML 文件的逻辑
【发布时间】:2016-10-11 13:44:33
【问题描述】:

我有一个 XML 文件,我正在尝试使用 vb.net 读取和重写(以供以后操作)到一个新的文本文件。

我能够成功读取 XML 并将其打印出来,但我无法正确获取每个元素/属性的开始和结束标签。

我正在使用“xmlNodeReader”通过获取每次读取的名称和值来读取文档。 然后是 xmlNodeType.ElementxmlNodeType.EndElement 的选择案例

我如何获得解决此问题的正确逻辑,因为一些 XML 行的格式为 <Server Type="PropertyDefinitions">,而其他的格式为 <Server Type="aServerName"/>

我已经为endEntity 尝试了一个 if 循环,但似乎没有一个有效。这是(部分)我的代码,它显示了读写功能。 如果我没有提供足够的信息,请告诉我。

     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

显示 3 种不同类型标签的 XML 示例:

    <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>

【问题讨论】:

  • 您不使用 XmlDocument 是否有原因?它将允许您保存所有更改而无需自己编写 xml。

标签: xml vb.net if-statement reader


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    我建议您改为尝试使用 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")
    

    ... 是 Descendants 属性的别名 @ 表示一个属性

    因此,上面查找的节点是文档根的后代节点,其 Type 属性包含“aServerType1”。

    您也可以直接在XDocument中修改值,然后保存。

    保存文档:

    xml.Save("NewXMLFile.xml")
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多