繁体   English   中英

C#xml读/写/ xpath而不使用XmlDocument

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM