【问题标题】:Count Total Number of XmlNodes in C#计算 C# 中 XmlNode 的总数
【发布时间】:2010-04-15 12:50:02
【问题描述】:

我正在尝试找到一种方法以递归方式从 XmlNode 获取子节点的总数。

也就是说我要数所有的孩子,孙子等等。

我觉得有点像

node.SelectNodes(<fill in here>).Count

但我不知道 XPath 是什么。

【问题讨论】:

  • 没有看到您的 XML 样本,我们也无法确定 XPath!不过这种方法是正确的。
  • 为什么您需要查看我的 XML,因为我想计算所有节点而不考虑名称?

标签: c# xml xpath


【解决方案1】:

XPath 支持称为Axis specifier 的东西,因此您要查找的代码是

node.SelectNodes("descendant::*").Count

【讨论】:

  • 到处都在寻找这个。谢谢:)
【解决方案2】:

您所追求的 XPath 是

descendant::node() (1)

descendant::* (2)

上面的第一个 XPath 表达式 (1) 选择以当前节点为根的子树中的任何节点(文本节点、处理指令、注释、元素)。

(2) 选择以当前节点为根的子树中的任意元素节点。

【讨论】:

  • (2) 等价于descendant-or-self::*,但问题只针对子节点,不包括当前节点(当然只是减1)
  • 这也是正确的!但他比你更需要积分:S
【解决方案3】:
using System.Xml.Linq;

node.DescendantNodes().Count();

【讨论】:

    【解决方案4】:

    如果您正在执行 unfiltered 计数,您的问题暗示,您可以使用 ChildNodes 属性遍历它们:

    private int CountChildren(XmlNode node)
    {
       int total = 0;
    
       foreach (XmlNode child in node.ChildNodes)
       {
          total++;
          total += CountChildren(child);
       }
       return total;
    }
    

    【讨论】:

    • @Steve Danner, @Kevin 是的,我知道我可以递归地做到这一点,只是假设会有一种 xpath 方式
    【解决方案5】:

    你可以这样使用:

    private static int CountNodes(XmlNode node)
    {
        int count = 0;
    
        foreach (XmlNode childNode in node.ChildNodes)
        {
            count += CountNodes(childNode);
        }
    
        return count + node.ChildNodes.Count;
    }
    

    【讨论】:

      【解决方案6】:

      我认为虽然不是通过 xPath,但它会为你做到这一点:

      void CountNode(XmlNode node, ref int count)
      {
          count += node.ChildNodes.Count;
      
          foreach (XmlNode child in node.ChildNodes)
          {
              CountNode(child, ref count);
          }
      }
      

      这里是 xpath 中计数函数的链接供参考。

      http://msdn.microsoft.com/en-us/library/ms256103.aspx

      因此,如果您正在寻找所有相同类型的节点,您可以这样做

      //Your_node
      

      选择所有节点

      //*
      

      【讨论】:

      • descendant::Your_Node 选择当前节点下所有调用 Your_Node 的节点
      猜你喜欢
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多