2009-10-01 34 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; 
    }