2012-03-14 88 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 =測試2的水平= 2測試3的水平= 3

我不知道會有多少個節點,或者會有多少個級別。我可以把它寫成一個遞歸函數,但我認爲linq to xml可能有更好的提供。

+0

s/ASP.NET/.NET/in標籤:這裏沒有關於ASP.NET。 – Richard 2012-03-15 10:25:27

回答

2

您可以使用xpath來計算節點級別。例如。爲<child>test3</child>

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

編輯@Richard的意見建議來計算父節點沒有實例化XElement實例:

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

這樣可以節省他們

當然,你可以使用Ancestors()方法(在另一個答案中提出)獲取節點的祖先元素的集合並對它們進行計數:

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

這會給你同樣的結果。

+1

我建議'level = element.XPathEvaluate(「count(ancestor :: *)」)作爲int':這樣就保存了實例化'XElement'實例,然後對它們進行計數。 – Richard 2012-03-14 15:00:07

+0

@Richard,謝謝你的出色建議。看來這是最好的解決方案。唯一的事情 - 返回的表達式的類型是「double」而不是「int」。 – Alex 2012-03-14 15:05:59

+0

作爲double的返回值是因爲XSLT中的所有數值都是浮點數,但顯然cou​​nt的結果必須是整數值 - 可能應該首選包含明確轉換的轉換:-)。 – Richard 2012-03-15 10:24:25