【问题标题】:How to get depth of node [duplicate]如何获得节点的深度[重复]
【发布时间】:2012-03-14 09:54:12
【问题描述】:

可能重复:
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 获取这些项目的级别

测试级别=1 级别测试2=2 级别测试3=3

我不知道会有多少节点或会有多少级别。我可以把它写成一个递归函数,但我认为 linq to xml 可能会提供更好的东西。

【问题讨论】:

  • s/ASP.NET/.NET/ 在标签中:这里没有关于 ASP.NET 的内容。

标签: .net linq linq-to-xml


【解决方案1】:

您可以使用 xpath 来计算节点级别。例如。对于&lt;child&gt;test3&lt;/child&gt;

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();

这会给你同样的结果。

【讨论】:

  • 我建议 level = element.XPathEvaluate("count(ancestor::*)") as int:这样可以节省实例化 XElement 实例,然后再计算它们。
  • @Richard,感谢您的出色建议。看来这是最好的解决方案。唯一的 - 返回表达式的类型是 double 而不是 int
  • 作为双精度返回是因为 XSLT 中的所有数字都是浮点数,但显然 count 的结果必须是一个整数值 - 可能应该首选强制转换以包含显式转换 :-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多