Я пытаюсь найти способ получить общее количество дочерних узлов от XmlNode рекурсивно.
То, что это должно сказать, что я хочу считать всех детей, главных детей и т.д.
Я думаю что-то как
node.SelectNodes(<fill in here>).Count
но я не знаю, каков XPath.
XPath поддерживает так называемый спецификатор оси , поэтому код, который вы ищете, -
node.SelectNodes("descendant::*").Count
Вы можете использовать что-то вроде этого:
private static int CountNodes(XmlNode node)
{
int count = 0;
foreach (XmlNode childNode in node.ChildNodes)
{
count += CountNodes(childNode);
}
return count + node.ChildNodes.Count;
}
Если вы выполняете подсчет нефильтрованных , что подразумевает ваш вопрос, вы можете просто пройти их, используя ChildNodes
свойство:
private int CountChildren(XmlNode node)
{
int total = 0;
foreach (XmlNode child in node.ChildNodes)
{
total++;
total += CountChildren(child);
}
return total;
}
Я думаю, это сделает это за вас, но не через 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
, чтобы выбрать все узлы
//*
] using System.Xml.Linq;
node.DescendantNodes().Count();
XPath, который вам нужен, :
Потомок :: узел ()
(1)
или
Потомок :: *
(2)
Первое выражение XPath (1) выше выбирает любой узел (текстовый узел, инструкция по обработке, комментарий, элемент) в поддереве, основанном на текущем узле.
(2) выбирает любой элемент-узел в поддереве, корень которого лежит на текущем узле.