[英]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.