我正在重构现有系统中的一些代码。目标是删除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