2010-02-05 65 views
4

我有這樣的XML:獲取一個項目的深度

<A><B>test</B><B><B>test2</B></B><B><B><B>test2</B></B></B></A> 

我怎樣才能得到每個使用LINQ to XML

水平測試= 1級測試2的這些項目的水平= 2級TEST3 = 3

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

回答

5

假設您已經加載了XML作爲XDocumentXElement對象,

myXElement.AncestorsAndSelf().Count()

應該給你任何元素的深度。

+0

有出自AncestorsAndSelf沒有返回COUNT()方法。此外,上述代碼的語義將返回比實際的基於0的深度更大的樹深度1。考慮下面的代碼片段,它可以解決這些問題。 – 2012-06-30 18:31:54

+0

public static int GetDepth(this XElement element) int count = 0; foreach(元素中的XElement元素.Ancestors()) Count ++; return count; } – 2012-06-30 18:32:30

+2

有一個Count()方法,它是一個LINQ擴展方法。如果您不想計算當前元素,請使用Ancestors()而不是AncestorsAndSelf()。 – Monsignor 2013-11-27 09:50:13

0

當你有,你可以找到每一個文本節點的深度如下根元素:

var depths = 
    root. 
    DescendantNodesAndSelf(). 
    Where(e => e.NodeType == XmlNodeType.Text). 
    Select(n => new { Text = n.ToString(), Depth = n.Parent.Ancestors().Count()});