2010-04-15 7 views
5

Я пытаюсь найти способ рекурсивно получить общее количество дочерних узлов из XmlNode.Count Общее количество XmlNodes в C#

Что это сказать, что я хочу, чтобы сосчитать всех детей, внуков и т.д.

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

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

, но я не знаю, что XPath является.

+0

Не видя образец вашего XML, мы не можем выяснить XPath либо! Подход правильный. – Oded

+0

Зачем вам нужно видеть мой XML, поскольку я хочу считать все узлы независимо от имени? –

ответ

8

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

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

Ищет это повсюду. Благодаря :) –

-1

Я думаю, что это будет делать это для вас, хотя и не через 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 

, чтобы выбрать все узлы

//* 
+0

'descendant :: Your_Node' выбирает все узлы * называется *' Your_Node' под текущим узлом – svick

0

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

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

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

@Steve Danner, @Kevin да, я знаю, что могу сделать это рекурсивно, просто предположим, что будет путь xpath –

0

Вы можете использовать Somthing так:

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

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

    return count + node.ChildNodes.Count; 
} 
3
using System.Xml.Linq; 

node.DescendantNodes().Count(); 
4

XPath вы после:

descendant::node() (1)

или

descendant::* (2)

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

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

+0

(2) эквивалентен на 'descendant-or-self :: *', но вопрос был только для дочерних узлов, не считая текущего узла (конечно, это просто вопрос вычитания 1) – svick

+0

@svick: Спасибо, исправлено. –

+0

Это тоже правильно! но ему нужны очки больше, чем вы: S –