2009-11-19 72 views
1

假設我需要使用C#在XML文件中查找特定節點。查找XML文件中的節點 - C#中的性能改進

<node attribute="my-target-attribute"> 

「my-target-attribute」是運行時的變量輸入。

該節點在XML文件中沒有特定的位置,我基本上只需要掃描整個XML層次結構,直到找到具有匹配屬性的節點。

有沒有什麼辦法可以預處理XML,因此找到節點會更快?我需要保持原來的XML結構。 XML文件可能有10,000個節點。

+0

這裏有兩種截然不同的情況:一種是將XML加載到內存中一次,然後重複查找內存中的表示('XmlDocument','XPathDocument','XDocument'等)。另一個是每次需要查找時都必須從文件中加載文檔。哪一個是你的? – 2009-11-19 03:14:13

+0

我願意接受任何一種實施。另一種選擇可能是預處理文件並將其內容加載到數據庫中。 – frankadelic 2009-11-19 03:51:43

+0

您是否需要專門獲取XML節點(例如,因爲您將把它交給其他XML處理API,比如'XslCompiledTransform')或只存儲其中的一些數據?如果後者是什麼樣的數據(只是一個字符串,一堆隨機值,一棵樹的節點......)? – 2009-11-19 06:02:45

回答

4

的開銷,你當然可以預處理XML使查找更快:

Dictionary<string, XmlElement> elementMap = new Dictionary<string, XmlElement>(); 
AddElementToMap(doc.DocumentElement, elementMap); 
... 
private void AddElementToMap(XmlElement elm, Dictionary<string, XmlElement> elementMap) 
{ 
    elementMap[elm.GetAttribute("attribute")] = elm; 
    foreach (XmlElement child in elm.SelectNodes("node")) 
    { 
     AddElementToMap(child, elementMap); 
    } 
} 

一旦你做到了這一點,查找很簡單:

XmlElement elm = elementMap[value]; 

該代碼假定文檔中的每個元素都被命名爲「node」,每個元素都有一個名爲「attribute」的屬性,並且所有屬性值都是唯一的。如果這些條件中的任何一條不真實,代碼就會更復雜,但並非如此。

1

您可以使用xslt轉換xml,以使節點處於已知深度。然後,當您使用XPath進行選擇時,您可以選擇相應的方式,而無需使用//運算符。

+0

這可能不適用於我的一個原因...我的節點全部命名爲。 所以我的XPATH將全部是: /節點/節點/節點/節點/ [@屬性='我的目標屬性'] – frankadelic 2009-11-19 03:56:24

+0

這是一個非常怪異的xml結構 – 2009-11-19 08:34:34

0

類似於另一個答案,可以使用xpath類似於selectNodes("//[@attribute='my-target-attribute']")//將搜索所有級別深度的節點。