如何正确循环遍历所有 XML 个节点?
How do I properly loop through all XML nodes?
我有一个 XML 文件,我想使用每个节点的属性,结构如下:
<level1 attr1="value" attr2="value">
<level2 attr3="value">
<level3 attr1="value" attr3="value">
</level3>
</level2>
<level2 attr3="value">
<level3 attr1="value" attr3="value">
</level3>
</level2>
<level2 attr3="value">
<level3 attr1="value" attr3="value">
</level3>
</level2>
</level1>
<level1>
....
</level1>
我试图遍历文件中的每个节点并记录来自属性的信息。
代码:
Dim xml As New XDocument
Dim root As New XElement
xml = XDocument.Load(myFileLoc)
root = xml.Root
For Each level1 in root.Descendants()
'Do Something with level1 attr'
For Each level2 in level1.Descendants()
'Do Something with level2 attr'
For Each level3 in level2.Descendants()
'Do Something with level3 attr'
Next
Next
Next
我很快了解到,这将多次遍历整个文档,因为 root.Descendants()
中的 level1 也将是所有子级 level2s 和 level3s。
如何将每个 level1/level2/level3 限制为仅当前节点深度?或者,我应该如何做这样的工作?
你为什么不使用 root.ChildNodes
?
一个节点的Descendants
表示所有子节点,然后是子节点的子节点,以此类推。
如果您使用 ChildNodes
,您的问题应该得到解决,因为它只访问一层深度。还使用 HasChildNodes
检查是否存在子节点。
马克提供了我正在寻找的东西,谢谢。使用 Elements()
而不是 Descendants()
提供了我希望在每个级别循环的节点。
Dim xml As New XDocument
Dim root As New XElement
xml = XDocument.Load(myFileLoc)
root = xml.Root
For Each level1 in root.Elements()
'Do Something with level1 attr'
For Each level2 in level1.Elements()
'Do Something with level2 attr'
For Each level3 in level2.Elements()
'Do Something with level3 attr'
Next
Next
Next
我更喜欢使用 XElement
Dim xe As XElement
' to load from a file
' Dim yourpath As String = "your path here"
'xe = XElement.Load(yourpath)
' for testing
xe = <root>
<level1 attr1="value1" attr2="value2">
<level2 attr3="valueQ">
<level3 attr1="value3" attr3="value4">
</level3>
</level2>
<level2 attr3="value5">
<level3 attr1="value6" attr3="value7">
</level3>
</level2>
<level2 attr3="value8">
<level3 attr1="value9" attr3="value10">
</level3>
</level2>
</level1>
<level1 attr1="value11" attr2="value12"></level1>
</root>
For Each el1 As XElement In xe...<level1>
Debug.WriteLine(el1.@attr1)
For Each el2 As XElement In el1...<level2>
Debug.WriteLine(el2.@attr3)
For Each el3 As XElement In el2...<level3>
Debug.WriteLine(el3.@attr3)
Next
Next
Next
' to save file
' xe.Save(yourpath)
我有一个 XML 文件,我想使用每个节点的属性,结构如下:
<level1 attr1="value" attr2="value">
<level2 attr3="value">
<level3 attr1="value" attr3="value">
</level3>
</level2>
<level2 attr3="value">
<level3 attr1="value" attr3="value">
</level3>
</level2>
<level2 attr3="value">
<level3 attr1="value" attr3="value">
</level3>
</level2>
</level1>
<level1>
....
</level1>
我试图遍历文件中的每个节点并记录来自属性的信息。
代码:
Dim xml As New XDocument
Dim root As New XElement
xml = XDocument.Load(myFileLoc)
root = xml.Root
For Each level1 in root.Descendants()
'Do Something with level1 attr'
For Each level2 in level1.Descendants()
'Do Something with level2 attr'
For Each level3 in level2.Descendants()
'Do Something with level3 attr'
Next
Next
Next
我很快了解到,这将多次遍历整个文档,因为 root.Descendants()
中的 level1 也将是所有子级 level2s 和 level3s。
如何将每个 level1/level2/level3 限制为仅当前节点深度?或者,我应该如何做这样的工作?
你为什么不使用 root.ChildNodes
?
Descendants
表示所有子节点,然后是子节点的子节点,以此类推。
如果您使用 ChildNodes
,您的问题应该得到解决,因为它只访问一层深度。还使用 HasChildNodes
检查是否存在子节点。
马克提供了我正在寻找的东西,谢谢。使用 Elements()
而不是 Descendants()
提供了我希望在每个级别循环的节点。
Dim xml As New XDocument
Dim root As New XElement
xml = XDocument.Load(myFileLoc)
root = xml.Root
For Each level1 in root.Elements()
'Do Something with level1 attr'
For Each level2 in level1.Elements()
'Do Something with level2 attr'
For Each level3 in level2.Elements()
'Do Something with level3 attr'
Next
Next
Next
我更喜欢使用 XElement
Dim xe As XElement
' to load from a file
' Dim yourpath As String = "your path here"
'xe = XElement.Load(yourpath)
' for testing
xe = <root>
<level1 attr1="value1" attr2="value2">
<level2 attr3="valueQ">
<level3 attr1="value3" attr3="value4">
</level3>
</level2>
<level2 attr3="value5">
<level3 attr1="value6" attr3="value7">
</level3>
</level2>
<level2 attr3="value8">
<level3 attr1="value9" attr3="value10">
</level3>
</level2>
</level1>
<level1 attr1="value11" attr2="value12"></level1>
</root>
For Each el1 As XElement In xe...<level1>
Debug.WriteLine(el1.@attr1)
For Each el2 As XElement In el1...<level2>
Debug.WriteLine(el2.@attr3)
For Each el3 As XElement In el2...<level3>
Debug.WriteLine(el3.@attr3)
Next
Next
Next
' to save file
' xe.Save(yourpath)