我正在重構現有系統中的一些代碼。目標是刪除XmlDocument的所有實例以減少內存佔用量。但是,我們使用XPath在應用某些規則時操縱xml。有沒有辦法在不使用將整個文檔加載到內存的類的情況下使用XPath?我們已經用XmlTextReader替換了所有其他實例,但這些只是因爲沒有XPath而且讀取非常簡單。C#xml讀/寫/ xpath不使用XmlDocument
某些XPath使用其他節點的值作爲其決策的依據。例如,消息節點的值可能基於數量節點的值,因此需要一次訪問多個節點。
我正在重構現有系統中的一些代碼。目標是刪除XmlDocument的所有實例以減少內存佔用量。但是,我們使用XPath在應用某些規則時操縱xml。有沒有辦法在不使用將整個文檔加載到內存的類的情況下使用XPath?我們已經用XmlTextReader替換了所有其他實例,但這些只是因爲沒有XPath而且讀取非常簡單。C#xml讀/寫/ xpath不使用XmlDocument
某些XPath使用其他節點的值作爲其決策的依據。例如,消息節點的值可能基於數量節點的值,因此需要一次訪問多個節點。
如果您的XPATH表達式基於訪問多個節點,您只需要將XML讀取到DOM中。兩件事,但。首先,您不必將全部讀取到DOM中,只是您要查詢的部分。其次,你使用哪個DOM有所作爲; XPathDocument是隻讀的,並針對XPATH查詢速度進行了調優,與更通用但價格昂貴的XmlDocument不同。
我暗示使用System.Xml.Linq.XDocument也禁止?否則,這將是一個不錯的選擇,因爲它比XmlDocument更快(正如我記得)。
支持的XPath意味着支持查詢:
//address[/states/state[@code=current()/@code]='California']
或
//item[@id != preceding-sibling/item/@id]
其要求的XPath處理器能夠到處看看在文檔中。你不會找到只向前的XPath處理器。
我的答案顯示使用XPathDocument以僅前向方式處理XPath – Alexis 2011-11-16 16:27:07
如果搜索查詢導致向後搜索(如發佈的XPath中的情況),會發生什麼情況? – 2011-11-18 06:26:14
執行此操作的方法是使用XPathDocument,它可以接收流 - 因此您可以使用StringReader。
以正向讀取方式返回值,而無需使用XmlDocument將整個XML DOM加載到內存中。
這裏是返回滿足XPath查詢所述第一節點的值的示例:
public string extract(string input_xml)
{
XPathDocument document = new XPathDocument(new StringReader(input_xml));
XPathNavigator navigator = document.CreateNavigator();
XPathNodeIterator node_iterator = navigator.Select(SEARCH_EXPRESSION);
node_iterator.MoveNext();
return node_iterator.Current.Value;
}
一切比XmlDocument的更快。 :-) – 2009-10-01 15:09:50
但是,由於它允許更改XML,所以它可能比XPathDocument慢。 – 2009-10-01 15:10:29
是的,可能是,但標題指出它需要讀/寫/ xpath,所以我猜XPathDocument不會。 – Philippe 2009-10-01 15:23:32