繁体   English   中英

如何在 VB.NET 中读取 XML 元素

[英]How to read XML elements in VB.NET

我有一个非常简单的问题,但由于我是 XML 的新手,所以我遇到了一些问题。 我有这个 XML 文档:

<?xml version="1.0" encoding="utf-8"?>  
<Form_Layout>
  <Location>
    <LocX>100</LocX>
    <LocY>100</LocY>  
  </Location>  
  <Size>  
    <Width>300</Width>  
    <Height>300</Height>  
  </Size>  
</Form_Layout> 

我想要做的是将 LocX、LoxY、Width 和 Height 元素中的值读入我相应的变量中。

这是我尝试过的:

Dim XmlReader = New XmlNodeReader(xmlDoc)  
While XmlReader.Read  
    Select Case XmlReader.Name.ToString()  
        Case "Location"  
            If XmlReader.??  
        Case "Size"  
            If XmlReader.??
    End Select  
End While  

但是,我无法弄清楚如何访问每个子节点。

如果您能够使用 Linq to XML,则可以使用 VB 的XML 轴属性

Dim root As XElement = XDocument.Load(fileName).Root

Dim LocX = Integer.Parse(root.<Location>.<LocX>.Value)
Dim LocY = Integer.Parse(root.<Location>.<LocY>.Value)

而且root.<Location>.<LocY>.Value = CStr(120)工作。

下面介绍如何使用XmlDocument和 XPath 来完成此操作。 我相信其他人会很乐意自愿提供一个使用XDocument和 LINQ 的示例。

Dim doc As New XmlDocument()
doc.LoadXml("...")
Dim locX As Integer = Integer.Parse(doc.SelectSingleNode("/FormLayout/Location/LocX").InnerText)
Dim locY As Integer = Integer.Parse(doc.SelectSingleNode("/FormLayout/Location/LocY").InnerText)
Dim width As Integer = Integer.Parse(doc.SelectSingleNode("/FormLayout/Size/Width").InnerText)
Dim height As Integer = Integer.Parse(doc.SelectSingleNode("/FormLayout/Size/Height").InnerText)

此外,您可能想查看XmlSerializer类,看看您是否对它感兴趣。该类将读取 XML 文档并使用它来填充新对象的属性值。 您只需要创建一个类来模拟 XML 的结构,以便将其反序列化。

使用 LINQ-XML,

Dim root As XElement = XDocument.Load(fileName).Root

Dim LocX = Integer.Parse(root.Element("Location").Element("LocX").Value)
Dim LocY = Integer.Parse(root.Element("Location").Element("LocY").Value)

每个 XML 文档可以在最顶部位置有一个声明节点。 声明节点提供有关 xml 文档的信息:

<?xml version="1.0" encoding="utf-8"?> 

在声明节点之后的 xml 文档中必须存在根节点。 在你的例子中,根节点被命名为“Form_Layout”。

<Form_Layout>

System.Xml 命名空间中可用的类对象可用于读取和操作数据,然后将数据保存到 xml 文件。 您可以使用文件流对象读取 xml 文件的全部内容。 您可以修改节点,然后将其保存到新文件或覆盖现有文件。 以下代码可用于将 xml 文件加载到 XmlDataDocument 对象中。

    Dim xmlDoc As System.Xml.XmlDataDocument = New System.Xml.XmlDataDocument
    Dim filepath As String = "C:\Users\mraso\Documents\location.xml"
    Dim loadedIn As Boolean = False, readbln As Boolean = False
    Dim fstream As System.IO.FileStream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
    If fstream IsNot Nothing Then
        xmlDoc.Load(fstream)
        loadedIn = True
    End If
    fstream.Close()
    fstream.Dispose()
    fstream = Nothing

您可以使用 XmlDataDocument 对象的 ChildNodes 属性来读取 xml 文档的声明节点和根节点。 您还可以调用每个节点的 ChildNodes 属性以获取其子节点作为回报。 您可以遍历 XmlNodeList 对象中的项目以访问各个节点。 使用您的 xml 文件的整个代码如下。

Private Sub TestReadingAndSavingXml()
    Dim xmlDoc As System.Xml.XmlDataDocument = New System.Xml.XmlDataDocument
    Dim filepath As String = "C:\Users\mraso\Documents\location.xml"
    Dim loadedIn As Boolean = False, readbln As Boolean = False
    Dim fstream As System.IO.FileStream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
    If fstream IsNot Nothing Then
        xmlDoc.Load(fstream)
        loadedIn = True
    End If
    fstream.Close()
    fstream.Dispose()
    fstream = Nothing
    Dim ndList1 As System.Xml.XmlNodeList = xmlDoc.ChildNodes
    If ndList1 IsNot Nothing Then
        Dim cnt As Integer = ndList1.Count
        For Each nd1 As System.Xml.XmlNode In ndList1
            If nd1.Name = "Form_Layout" Then
                Dim nd2 As System.Xml.XmlNode = GetChildNode(nd1, "Location")
                If nd2 IsNot Nothing Then
                    Dim nd3 As System.Xml.XmlNode = GetChildNode(nd2, "LocX")
                    If nd3 IsNot Nothing Then
                        Dim LocX_value As Integer = nd3.InnerText
                        Dim s = LocX_value
                    End If
                End If
            End If
        Next
    End If
    'Save data to a new xml file
    Dim outputXml As String = "C:\Users\mraso\Documents\location2.xml"
    xmlDoc.Save(outputXml)
End Sub

Function GetChildNode(ByRef node As System.Xml.XmlNode,
                      ByVal nodeName As String) As System.Xml.XmlNode
    If node IsNot Nothing Then
        Dim ndList1 As System.Xml.XmlNodeList = node.ChildNodes
        If ndList1 IsNot Nothing Then
            For Each nd1 As System.Xml.XmlNode In ndList1
                If nd1.Name = nodeName Then
                    Return nd1
                End If
            Next
        End If
    End If
    Return Nothing
End Function

上面的代码将读取以下 xml 文件中节点“LocX”中的值 100。

<?xml version="1.0" encoding="utf-8"?>  
<Form_Layout>
  <Location>
    <LocX>100</LocX>
    <LocY>100</LocY>  
  </Location>  
  <Size>  
    <Width>300</Width>  
    <Height>300</Height>  
  </Size>  
</Form_Layout>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM