2012-03-14 2 views
0

可能性の重複:
Get the depth of an Itemどのノードの深さを得るために

私はこのようなXMLを持っている:

<Parent> 
    <child>test</child> 
    <child> 
     <child>test2</child> 
    </child> 
    <child> 
     <child> 
      <child>test3</child> 
     </child> 
    </child> 
</Parent> 

は、どのように私は、これらのそれぞれのレベルを得ることができますlinq to xmlを使用しているアイテム

leve 1テストのレベル= 1テストのレベル2 = 2レベルのテスト3 = 3

どのくらいのノードがあるか、いくつのレベルがあるかはわかりません。私はこれを再帰関数として書くことができますが、XMLにlinqが提供する方が良いと思っていました。

+0

タグ:/ ASP.NET/.NET /タグ:ここではASP.NETについては何もありません。 – Richard

答えて

2

xpathを使用してノードレベルを計算することができます。例えば。

var element = d.XPathSelectElement("Parent/child/child/child"); 
var level = element.XPathSelectElements("ancestor::*").Count(); 

EDIT<child>test3</child>ため

var level = (double)element.XPathEvaluate("count(ancestor::*)"); 

これは彼らに

を節約し、もちろん、あなたが使用することができます@RichardコメントにXElementインスタンスをインスタンス化することなく、親ノードを計算することを提案Ancestors()(別の答えで提案されているように)ノードの祖先要素の集合を取得し、それらを数えます:

var level = element.Ancestors().Count(); 

これは、あなたと同じ結果が得られます。

+1

私は 'level = element.XPathEvaluate(" count(ancestor :: *) ")をintとして提案します:これは' XElement'インスタンスをインスタンス化してそれらを数えるだけです。 – Richard

+0

@リチャード、素晴らしい提案のおかげで。これが最善の解決策だと思われます。唯一のもの - 返される式の型は 'int'ではなく' double'です。 – Alex

+0

XSLTのすべての数値は浮動小数点であるため、countの結果は整数値でなければならないことが明らかです。おそらく明示的な変換を含めるにはキャストを優先させるべきでしょう:-)。 – Richard

関連する問題