2017-05-04 18 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 

root.Descendants()でLEVEL1はまた、すべての子どもlevel2sとlevel3sになりますので、私は文書全体に数回でこの意志ループすることをすぐに学びました。

どのようにして各レベル1 /レベル2 /レベル3を現在のノードの深さに制限できますか?あるいは、私はこの種の仕事をどのようにしなければなりませんか?

+0

を使って好みは 'あなたがやりたい)'要素() ''の代わりに子孫(のを使っていますか? – Mark

+0

はい、これは私が必要としていたものです。ありがとうございました! – h01001000

答えて

0

マークは私が探していたものであり、ありがとうございました。 Descendants()ではなくElements()を使用して、各レベルでループスルーするノードを提供しました。

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を使用すると、1つのレベルにしかアクセスできないため、問題を解決する必要があります。また、子ノードが存在するかどうか確認するのに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) 
関連する問題