I\'m trying to find a way to get the total number of child nodes from an XmlNode recursively.
That it is to say I want to count all the children, grand children etc.
I think this will do it for you though not through xPath:
void CountNode(XmlNode node, ref int count)
{
count += node.ChildNodes.Count;
foreach (XmlNode child in node.ChildNodes)
{
CountNode(child, ref count);
}
}
For reference here is a link to the count function in xpath.
http://msdn.microsoft.com/en-us/library/ms256103.aspx
so if you were looking for all the same type of nodes you could do
//Your_node
to select all the nodes
//*
If you're doing an unfiltered count, which your question implies, you could just traverse the them using the ChildNodes
property:
private int CountChildren(XmlNode node)
{
int total = 0;
foreach (XmlNode child in node.ChildNodes)
{
total++;
total += CountChildren(child);
}
return total;
}
The XPath you are after is:
descendant::node()
(1)
or
descendant::*
(2)
The first XPath expresion (1) above selects any node (text-node, processing-instruction, comment, element) in the subtree rooted by the current node.
(2) selects any element node in the subtree rooted by the current node.
You could use somthing like this:
private static int CountNodes(XmlNode node)
{
int count = 0;
foreach (XmlNode childNode in node.ChildNodes)
{
count += CountNodes(childNode);
}
return count + node.ChildNodes.Count;
}
XPath supports something called Axis specifier, so the code you're looking for is
node.SelectNodes("descendant::*").Count
using System.Xml.Linq;
node.DescendantNodes().Count();