3

我有一个非常简单的问题,但是由于我是 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  

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

4

4 回答 4

3

如果您能够使用 Linq to XML,则可以使用 VB 的XML Axis Properties

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)也有效。

于 2012-07-22T10:00:15.203 回答
0

以下是使用XmlDocumentXPath 的方法。我相信其他人会很乐意自愿提供一个使用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 结构的类,即可将其反序列化为。

于 2012-07-20T15:02:50.007 回答
0

使用 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)
于 2012-07-20T15:21:57.527 回答
0

每个 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>
于 2021-12-16T13:26:12.543 回答