c# - 在 .NET 中如何最好地使用 XPath 处理非常大的 XML 文件?

标签 c# .net xml xpath large-files

我需要在 C# 中对相当大的 XML 文件(这里的大文件可能超过 1 GB)进行一些处理,包括执行一些复杂的 xpath 查询。我遇到的问题是,我通常通过 System.XML 库执行此操作的标准方法喜欢在对文件执行任何操作之前将整个文件加载到内存中,这可能会导致这种大小的文件出现内存问题。

我根本不需要更新文件,只需读取文件并查询其中包含的数据即可。一些 XPath 查询非常复杂并且跨越多个级别的父子类型关系 - 我不确定这是否会影响使用流读取器而不是将数据作为 block 加载到内存中的能力。

我认为使它起作用的一种方法是使用基于流的方法执行简单分析,也许将 XPath 语句包装到 XSLT 转换中,之后我可以在这些文件中运行,尽管它看起来有点复杂。

或者我知道有一些 XPath 查询不会遇到的元素,所以我想我可以根据它的原始树结构将文档分成一系列较小的片段,这些片段可能足够小以进行处理在内存中不会造成太大的破坏。

我已经尝试在这里解释我的目标,所以如果我在一般方法方面完全错误地咆哮树,我相信你们可以让我正确...

最佳答案

XPathReader 就是答案。它不是 C# 运行时的一部分,但可以从 Microsoft 下载。这是一个 MSDN article .

如果您使用 XmlTextReader 构建 XPathReader,您可以利用 XPath 表达式的便利性获得流式读取的效率。

我没有在 GB 大小的文件上使用过它,但我已经在数十兆字节的文件上使用过它,这通常足以减慢基于 DOM 的解决方案的速度。

引用以下内容:“XPathReader 提供了以流方式对 XML 文档执行 XPath 的能力”。

Download from Microsoft

关于c# - 在 .NET 中如何最好地使用 XPath 处理非常大的 XML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/407350/

相关文章:

c# - 保存 '&' 登录 Cookie

c# - U-SQL 将一列拆分为两列,由 "-"分隔

C# - 无法调试 office word 加载项

.net - MonoTouch 中的 System.Runtime.Caching.MemoryCache

c# - 在目录中搜索以 ACCESS 开头的文件,然后搜索该文件

.net - 如何在不依赖 .NET 4 SDK DLL/库文件的 visual studio 2010 中构建可执行文件?

.net - 我可以在没有 .NET 库的情况下使用 Windows 身份验证使用 WCF REST 服务吗?

xml - 使用 XSLT 以 3 列输出分组列表

xml - 使用xslt在父节点下查找所有唯一的xml first节点

xml - 使用 xslt 渲染 ?x=1&y=2 类型的 url