2009-10-01 74 views
3

我正在重構現有系統中的一些代碼。目標是刪除XmlDocument的所有實例以減少內存佔用量。但是,我們使用XPath在應用某些規則時操縱xml。有沒有辦法在不使用將整個文檔加載到內存的類的情況下使用XPath?我們已經用XmlTextReader替換了所有其他實例,但這些只是因爲沒有XPath而且讀取非常簡單。C#xml讀/寫/ xpath不使用XmlDocument

某些XPath使用其他節點的值作爲其決策的依據。例如,消息節點的值可能基於數量節點的值,因此需要一次訪問多個節點。

回答

3

如果您的XPATH表達式基於訪問多個節點,您只需要將XML讀取到DOM中。兩件事,但。首先,您不必將全部讀取到DOM中,只是您要查詢的部分。其次,你使用哪個DOM有所作爲; XPathDocument是隻讀的,並針對XPATH查詢速度進行了調優,與更通用但價格昂貴的XmlDocument不同。

1

我暗示使用System.Xml.Linq.XDocument也禁止?否則,這將是一個不錯的選擇,因爲它比XmlDocument更快(正如我記得)。

+2

一切比XmlDocument的更快。 :-) – 2009-10-01 15:09:50

+1

但是,由於它允許更改XML,所以它可能比XPathDocument慢。 – 2009-10-01 15:10:29

+0

是的,可能是,但標題指出它需要讀/寫/ xpath,所以我猜XPathDocument不會。 – Philippe 2009-10-01 15:23:32

0

支持的XPath意味着支持查詢:

//address[/states/state[@code=current()/@code]='California'] 

//item[@id != preceding-sibling/item/@id] 

其要求的XPath處理器能夠到處看看在文檔中。你不會找到只向前的XPath處理器。

+0

我的答案顯示使用XPathDocument以僅前向方式處理XPath – Alexis 2011-11-16 16:27:07

+0

如果搜索查詢導致向後搜索(如發佈的XPath中的情況),會發生什麼情況? – 2011-11-18 06:26:14

0

執行此操作的方法是使用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; 
    }