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

时间:2009-10-01 14:59:34

标签: c# xml xpath xmldocument

我正在重构现有系统中的一些代码。目标是删除XmlDocument的所有实例以减少内存占用。但是,当某些规则适用时,我们使用XPath来操作xml。有没有办法使用XPath而不使用将整个文档加载到内存中的类?我们用XmlTextReader替换了所有其他实例,但那些只能用,因为没有XPath,读取非常简单。

一些XPath使用其他节点的值作为其决策依据。例如,消息节点的值可以基于量节点的值,因此需要一次访问多个节点。

4 个答案:

答案 0 :(得分:3)

如果您的XPATH表达式基于访问多个节点,那么您只需要将XML读入DOM即可。但有两件事。首先,您不必将所有读取到DOM中,只需要查询的部分。其次,你使用哪个DOM会产生影响; XPathDocument是只读的,并针对XPATH查询速度进行了调整,与更通用但价格昂贵的XmlDocument不同。

答案 1 :(得分:1)

我认为使用System.Xml.Linq.XDocument也是禁止的?否则,它将是一个不错的选择,因为它比XmlDocument更快(我记得)。

答案 2 :(得分:0)

支持XPath意味着支持以下查询:

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

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

要求XPath处理器能够在文档中的任何位置查找。你不会找到一个只有前向的XPath处理器。

答案 3 :(得分: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;
    }