2010-04-15 27 views
5

Estoy tratando de encontrar una manera de obtener el número total de nodos secundarios de un XmlNode recursivamente.Contar número total de XmlNodes en C#

Eso es decir que quiero contar todos los niños, nietos, etc.

Creo que es algo así como

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

pero no sé lo que el XPath es.

+0

Sin ver una muestra de su XML, no podemos averiguar la XPath, ya sea! Sin embargo, el enfoque es correcto. – Oded

+0

¿Por qué necesita ver mi XML ya que quiero contar todos los nodos independientemente de su nombre? –

Respuesta

8

XPath es compatible con algo que se llama Axis specifier, por lo que el código que está buscando es

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

Estaba buscando esto en todas partes. Gracias :) –

-1

creo que esto lo hará por usted, aunque no a través xRuta:

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

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

Como referencia aquí es un enlace a la función de recuento de XPath.

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

así que si estabas buscando todos del mismo tipo de nodos que podría hacer

//Your_node 

para seleccionar todos los nodos

//* 
+0

'descendiente :: Your_Node' selecciona todos los nodos * llamado *' Your_Node' debajo del nodo actual – svick

0

Si estás haciendo un sin filtro recuento, lo que su pregunta implica, puede simplemente recorrerlos con la propiedad 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 sí Sé que puedo hacerlo de forma recursiva, solo suponía que habría una ruta xpath –

0

Usted podría utilizar algo como esto:

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

El XPath que está después es:

descendant::node() (1)

o

descendant::* (2)

La primera expresion XPath (1) anterior selecciona cualquier nodo (texto-nodo, instrucción de procesamiento, comentario, elemento) en el subárbol con raíz por el nodo actual.

(2) selecciona cualquier elemento nodo en el subárbol enraizado por el nodo actual.

+0

(2) es equivalente a 'descenddant-or-self :: *', pero la pregunta era solo para los nodos secundarios, sin incluir el nodo actual (por supuesto, es solo cuestión de restar 1) – svick

+0

@svick: Gracias, corregido. –

+0

¡Esto también es correcto! pero él necesita los puntos más que usted: S –

Cuestiones relacionadas