Подсчет общего количества узлов Xml в C # - PullRequest
5 голосов
/ 15 апреля 2010

Я пытаюсь найти способ рекурсивного получения общего числа дочерних узлов из XmlNode.

То есть я хочу подсчитать всех детей, внуков и т. Д.

Я думаю, что-то вроде

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

, но я не знаю, что такое XPath.

Ответы [ 6 ]

8 голосов
/ 15 апреля 2010

XPath поддерживает то, что называется Спецификатор оси , поэтому код, который вы ищете -

node.SelectNodes("descendant::*").Count
4 голосов
/ 15 апреля 2010

XPath, за которым вы следите, :

descendant::node() (1)

или

descendant::* (2)

Первое выражение XPath (1), приведенное выше, выбирает любой узел (текстовый узел, инструкция обработки, комментарий, элемент) в поддереве с корнем текущего узла.

(2) выбирает любой элементный элемент в поддереве, корнем которого является текущий узел.

3 голосов
/ 15 апреля 2010
using System.Xml.Linq;

node.DescendantNodes().Count();
0 голосов
/ 15 апреля 2010

Вы можете использовать что-то вроде этого:

private static int CountNodes(XmlNode node)
{
    int count = 0;

    foreach (XmlNode childNode in node.ChildNodes)
    {
        count += CountNodes(childNode);
    }

    return count + node.ChildNodes.Count;
}
0 голосов
/ 15 апреля 2010

Если вы делаете подсчет нефильтрованный , который подразумевает ваш вопрос, вы можете просто просмотреть их, используя свойство ChildNodes:

private int CountChildren(XmlNode node)
{
   int total = 0;

   foreach (XmlNode child in node.ChildNodes)
   {
      total++;
      total += CountChildren(child);
   }
   return total;
}
0 голосов
/ 15 апреля 2010

Я думаю, что это сделает это за вас, но не через xPath:

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

    foreach (XmlNode child in node.ChildNodes)
    {
        CountNode(child, ref count);
    }
}

Для справки вот ссылка на функцию count в xpath.

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

поэтому, если вы искали все узлы одного типа, вы могли бы сделать

//Your_node

для выбора всех узлов

//*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...