c++ - 为具有内存限制的大 XML 优化的 XML 库

标签 c++ c xml memory

我需要处理大型 XML 文件,但我想对其进行相对较小的更改。我还希望程序遵守严格的内存限制。我们绝不能使用超过 300Mb 的内存。

是否有一个库允许我将所有 DOM 保存在内存中,并在我遍历 DOM 时随时解析 XML?

我知道您可以使用基于回调的方法来做到这一点,但我不希望那样。我想吃我的蛋糕。我想使用 DOM API,但要延迟解析每个元素,这样使用 DOM API 的现有代码就不必更改。

对于这个问题,我想到了两种可能的方法:

  1. 解析惰性 XML,每次调用 getChildren() 都会解析下一段 XML。
  2. 解析整个 XML 树,但将您现在不使用的内容缓存在磁盘上。

其中两种方法是可以接受的,是否有现成的解决方案。

我正在寻找本地解决方案,但我对了解其他语言的库很感兴趣。

最佳答案

听起来你想要的是类似于 Streaming API for XML (StAX) 的东西.

虽然它不使用标准的 DOM API,但它在原则上类似于您的“getChildren()”方法。它没有 DOM 方法的内存开销,也没有回调 (SAX) 方法的复杂性。

Wikipedia page for StAX 上链接了许多实现。其中大部分用于 Java,但也有一些用于 C++ - Ambiera irrXMLLlamagraphics LlamaXML .


编辑:既然你提到了文档的“小改动”,如果你不需要将文档内容用于其他任何事情,你也可以考虑 Streaming Transformations for XML (STX) (在 this XML.com introduction to STX 中描述)。 STX 之于 XSLT 就像 SAX/StAX 之于 DOM。

关于c++ - 为具有内存限制的大 XML 优化的 XML 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219434/

相关文章:

c - 为什么函数式编程优于 C

java - 使用 XStream 创建不同对象的列表

c++ - 如何使upnp Action ?

c++ - 加解密后文件末尾出现垃圾

c++ - 在 unordered_map 中搜索的最佳实践

C++ 指向方法模板的推导在面向 x86 时无法编译,但适用于 x64

c++ - 将 32 位 float 映射到 32 位整数

检查一个数字是否是另一个数字的镜像(其相反)

java - TextView 中的旋转问题

c++ - 存储可通过键或序号 c++ 访问的数据的简单有效方法