2010-04-15 10 views
5

Ich versuche einen Weg zu finden, um die Gesamtzahl der Kind-Knoten von einem XmlNode rekursiv zu bekommen.Count Gesamtzahl der XmlNodes in C#

Dass es zu sagen, die ich alle Kinder, Enkelkinder usw.

zählen will ich denke, es ist etwas wie

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

aber ich weiß nicht, was die XPath ist.

+0

Ohne eine Probe Ihres XML zu sehen, können wir entweder herauszufinden, nicht die XPath! Der Ansatz ist jedoch korrekt. – Oded

+0

Warum müssen Sie mein XML sehen, da ich alle Knoten unabhängig vom Namen zählen möchte? –

Antwort

8

XPath für genannt unterstützt Sie suchen Axis specifier etwas, so dass der Code ist

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

War überall auf der Suche danach. Vielen Dank :) –

-1

Ich denke, das es aber nicht durch xPath für Sie tun:

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

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

Denn hier Bezug ein Link auf die Count-Funktion in XPath ist.

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

wenn Sie also für alle die gleiche Art von Knoten suchen könnten Sie tun

//Your_node 

die Knoten alle

//* 
+0

'abcendant :: Your_Node' wählt alle Knoten aus * aufgerufen *' Your_Node' unterhalb des aktuellen Knotens – svick

0

wählen Wenn Sie eine tun ungefiltert zählen, die Ihre Frage impliziert, könnten Sie einfach die sie mit der ChildNodes Eigenschaft durchlaufen:

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

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

@Steve Danner, @Kevin ja ich weiß ich kann es rekursiv tun, nur angenommen, es gäbe einen xpath Weg –

0

Sie somthing wie diese verwenden:

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

Die XPath Sie sind nach heißt:

descendant::node() (1)

oder

descendant::* (2)

Die erste XPath expresion (1) wählt über einen beliebigen Knoten (Text-Knoten, Verarbeitungsanweisungs-, Kommentar, Element) in dem Unterbaum durch den aktuellen Knoten wurzelt.

(2) wählt einen Elementknoten im Teilbaum aus, der vom aktuellen Knoten verwurzelt ist.

+0

(2) ist äquivalent zu "abcendant-or-self :: *", aber die Frage war nur für die Kind-Knoten, ohne den aktuellen Knoten (natürlich ist es nur eine Frage der Subtraktion 1) – svick

+0

@svick: Danke, korrigiert. –

+0

Das ist auch richtig! aber er braucht die Punkte mehr als du: S –

Verwandte Themen