如何正确遍历所有XML节点?

时间:2017-05-04 17:01:40

标签: xml vb.net xelement

我有一个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也将是所有子级别2和级别3。

如何将每个level1 / level2 / level3限制为仅当前节点深度?或者,我该怎么做这种工作?

3 个答案:

答案 0 :(得分:0)

为什么不使用root.ChildNodes

节点的

Descendants表示所有子节点,然后是子节点的子节点,依此类推。

如果您使用ChildNodes,则应该解决您的问题,因为它只访问一个级别。还可以使用HasChildNodes检查子节点是否存在。

答案 1 :(得分:0)

马克提供了我想要的东西,谢谢。使用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

答案 2 :(得分:0)

我更喜欢使用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)