假設我需要使用C#在XML文件中查找特定節點。查找XML文件中的節點 - C#中的性能改進
<node attribute="my-target-attribute">
「my-target-attribute」是運行時的變量輸入。
該節點在XML文件中沒有特定的位置,我基本上只需要掃描整個XML層次結構,直到找到具有匹配屬性的節點。
有沒有什麼辦法可以預處理XML,因此找到節點會更快?我需要保持原來的XML結構。 XML文件可能有10,000個節點。
假設我需要使用C#在XML文件中查找特定節點。查找XML文件中的節點 - C#中的性能改進
<node attribute="my-target-attribute">
「my-target-attribute」是運行時的變量輸入。
該節點在XML文件中沒有特定的位置,我基本上只需要掃描整個XML層次結構,直到找到具有匹配屬性的節點。
有沒有什麼辦法可以預處理XML,因此找到節點會更快?我需要保持原來的XML結構。 XML文件可能有10,000個節點。
的開銷,你當然可以預處理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」的屬性,並且所有屬性值都是唯一的。如果這些條件中的任何一條不真實,代碼就會更復雜,但並非如此。
您可以使用xslt轉換xml,以使節點處於已知深度。然後,當您使用XPath進行選擇時,您可以選擇相應的方式,而無需使用//運算符。
這可能不適用於我的一個原因...我的節點全部命名爲
這是一個非常怪異的xml結構 – 2009-11-19 08:34:34
隨着VTD-XML(http://vtd-xml.sf.net),你可以索引XML文檔轉換成VTD + XML, 這消除解析
類似於另一個答案,可以使用xpath類似於selectNodes("//[@attribute='my-target-attribute']")
。 //
將搜索所有級別深度的節點。
這裏有兩種截然不同的情況:一種是將XML加載到內存中一次,然後重複查找內存中的表示('XmlDocument','XPathDocument','XDocument'等)。另一個是每次需要查找時都必須從文件中加載文檔。哪一個是你的? – 2009-11-19 03:14:13
我願意接受任何一種實施。另一種選擇可能是預處理文件並將其內容加載到數據庫中。 – frankadelic 2009-11-19 03:51:43
您是否需要專門獲取XML節點(例如,因爲您將把它交給其他XML處理API,比如'XslCompiledTransform')或只存儲其中的一些數據?如果後者是什麼樣的數據(只是一個字符串,一堆隨機值,一棵樹的節點......)? – 2009-11-19 06:02:45