2014-09-04 34 views
1

我正在研究C#代碼。我有我的XML文檔與不同的節點,其中我需要計算具有相同的非文本值的節點的數量。我使用XmlDocument。假設我有一個xml文件,我必須計算具有InnerText值BSS的節點數。如何統計XML中具有相同內文值的節點數

代碼:

<Annotations> 
<Objects> 
    <ObjectId>BSS</ObjectId> 
    <ObjectId>CAT</ObjectId> 
</Objects> 
<Objects> 
    <ObjectId>BSS</ObjectId> 
    <ObjectId>ABC</ObjectId> 
</Objects> 
<Objects> 
    <ObjectId>BSS</ObjectId> 
    <ObjectId>PCT</ObjectId> 
</Objects> 
</Annotations> 

在這裏,在上面的代碼我想算具有的innerText值BSS.like這裏的數應3.您的幫助節點的數量將不勝感激。

編輯代碼:

<Annotations> 
<Objects> 
    <ObjectId>BSS|SAF|PAT</ObjectId> 
    <ObjectId>CAT</ObjectId> 
</Objects> 
<Objects> 
    <ObjectId>BSS|SAF|PAT</ObjectId> 
    <ObjectId>ABC</ObjectId> 
</Objects> 
<Objects> 
    <ObjectId>BSS|SAF|PAT</ObjectId> 
    <ObjectId>PCT</ObjectId> 
</Objects> 
</Annotations> 
+0

謝謝你Flynn – 2014-09-04 17:41:11

回答

3

如果你把它加載爲XmlDocument,你可以做

doc.selectNodes("//*[.='BSS']").Count; 

雖然我認爲可能有更有效的方式來編寫XPath,但匹配所有內容然後檢查其中的文本內容感覺可能效率不高。

如果這是一個完整的,有代表性的文檔,那麼你可以做

doc.selectNodes("Annotations/Objects/ObjectId[.='BSS']").Count; 

這將是更有效,因爲它的靶向特定的元素,而不是整個文檔。

如果搜索文本包含分隔列表管道(|)內,您可以使用此斷言,而不是[.='BSS']

[contains(concat('|',.,'|'),'|BSS|')] 

雖然這會慢一些。就個人而言,我建議無論您的源來自哪裏,都會修改它以將此列表分隔爲不同的元素,這將使查詢數據變得更加容易。我強烈支持XML文檔應遵循與數據庫所做的「第一範式」規則相同的原則,並且不在任何一個文本節點/屬性中包含多個值的原則。

+0

請讓我知道是否有任何有效的方式通過匹配整個路徑來編寫代碼。 – 2014-09-04 17:28:36

+0

謝謝弗林這爲我工作。但是我需要知道如果我有一個不同的場景,其中單個節點中有兩個或三個內部文本值,它們是管道或逗號分隔的。然後如何獲得相同BSS值的計數。請參閱編輯的代碼。 – 2014-09-10 11:13:24

1

我會使用新的Linq to XML API來代替:

var xDocument = XDocument.Load("path"); 

int count = xDocument.Descendants().Count(x => (string)x == "BSS"); 
+0

感謝您的幫助!但是,如果有任何解決方案使用XmlDocument這將是一個很大的幫助。就像在我當前的項目中,我使用Xmldocument並且不能使用Linq到XML .... – 2014-09-04 17:25:35

0
XmlDocument xmlD = new XmlDocument(); 
xmlD.Load(Server.MapPath("sample.xml")); 
XmlNodeList xmlNL = xmlD.GetElementsByTagName("tagName"); 
xmlNL.Count; 
+0

這不太可能有所幫助,OP詢問搜索內部文本與特定值匹配的節點,而不是標籤名稱。 – Flynn1179 2014-09-04 12:23:45

相關問題