我需要在C#中对相当大的XML文件(这里可能超过一千兆字节)进行一些处理,包括执行一些复杂的xpath查询.我遇到的问题是我通常通过System.XML库执行此操作的标准方法是在将任何内容添加到内存之前将整个文件加载到内存中,这会导致此大小的文件出现内存问题.
我只需要阅读它们并查询其中包含的数据就不需要更新文件.一些XPath查询非常复杂,并且涉及多个级别的父子类型关系 - 我不确定这是否会影响使用流式读取器的能力,而不是将数据作为块加载到内存中.
我可以看到使其工作的一种方法是使用基于流的方法执行简单分析,并且可能将XPath语句包装到XSLT转换中,之后我可以在文件中运行,尽管看起来有点复杂.
或者我知道XPath查询中有一些元素不能运行,所以我想我可以根据它的原始树结构将文档分解为一系列较小的片段,这可能足够小,可以在内存中处理造成太大的破坏.
我试图在这里解释我的目标,所以如果我在一般方法上咆哮完全错误的树我相信大家可以让我正确...
XPathReader就是答案.它不是C#运行时的一部分,但可以从Microsoft下载.这是一篇MSDN文章.
如果使用XmlTextReader构造XPathReader,则可以使用XPath表达式方便地获得流式读取的效率.
我没有在千兆字节大小的文件上使用它,但我已经在几十兆字节的文件上使用它,这通常足以减慢基于DOM的解决方案.
引用如下:"XPathReader提供了以流方式对XML文档执行XPath的能力".
从Microsoft下载