2010-04-15 37 views
5

我試圖找到一種方法來從XmlNode遞歸獲取子節點的總數。C#中的XmlNode計數總數

這是說我想指望所有的孩子,孫子等

我認爲它有點像

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

,但我不知道XPath是什麼。

+0

沒有看到你的XML的樣本,我們無法弄清楚的XPath要麼! 雖然這種方法是正確的。 – Oded 2010-04-15 12:54:37

+0

爲什麼您需要查看我的XML,因爲我想要統計所有節點而不考慮名稱? – 2010-04-15 13:02:58

回答

8

的XPath支持一種叫做Axis specifier,所以你要尋找的代碼是

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

正在尋找這個無處不在。謝謝 :) – 2011-12-15 13:47:05

-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 2010-04-15 13:18:24

0

如果你正在做一個未經過濾的計數,您的問題意味着,您可以使用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的方式 – 2010-04-15 12:58:11

0

您可以使用財產以後這樣的:

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)是等價的到'後代或自己:: *',但問題只針對子節點,不包括當前節點(當然,這只是減1的問題) – svick 2010-04-15 13:16:00

+0

@svick:謝謝,糾正。 – 2010-04-15 13:31:56

+0

這也是對的!但他需要的分數比你多:S – 2010-04-15 14:28:02