2012-03-14 60 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