[英]C# xml read/write/xpath without using XmlDocument
我正在重构现有系统中的一些代码。 目标是删除XmlDocument的所有实例以减少内存占用。 但是,当某些规则适用时,我们使用XPath来操作xml。 有没有办法使用XPath而不使用将整个文档加载到内存中的类? 我们已经用XmlTextReader替换了所有其他实例,但那些只能工作,因为没有XPath并且读取非常简单。
一些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,它可以获取流 - 因此您可以使用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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.