2017-05-04 70 views
0

我有我想從各個節點的結構中使用的屬性,像這樣的XML文檔:如何正確循環遍歷所有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 

我學得很快,通過整個文檔幾次這將循環,因爲1級在root.Descendants()也將是所有兒童level2s和level3s。

如何將每個level1/level2/level3限制爲僅當前節點深度?或者,我應該如何做這種工作?

+0

是否使用'元素()',而不是'後裔()'你想要什麼? – Mark

+0

是的,這正是我所需要的。謝謝Mark! – h01001000

回答

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 
0

你爲什麼不使用root.ChildNodes

Descendants節點意味着所有的子節點,然後是子節點的子節點,等等。

如果您使用ChildNodes,則應解決問題,因爲它只訪問一個深度級別。還使用HasChildNodes來檢查是否存在子節點。

+0

謝謝你看我的問題。但是,VS告訴我'ChildNodes'和'HasChildNodes'不是'System.Xml.Linq.XElement'的成員。也許我需要做一個導入來使用這些?我想我已經找到了一個解決方案, 'root.Elements()'應該返回我正在尋找的東西。 – h01001000

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([email protected]) 
     For Each el2 As XElement In el1...<level2> 
      Debug.WriteLine([email protected]) 
      For Each el3 As XElement In el2...<level3> 
       Debug.WriteLine([email protected]) 
      Next 
     Next 
    Next 

    ' to save file 
    ' xe.Save(yourpath)