我需要处理大型 XML 文件,但我想对其进行相对较小的更改。我还希望程序遵守严格的内存限制。我们绝不能使用超过 300Mb 的内存。
是否有一个库允许我不将所有 DOM 保存在内存中,并在我遍历 DOM 时随时解析 XML?
我知道您可以使用基于回调的方法来做到这一点,但我不希望那样。我想吃我的蛋糕。我想使用 DOM API,但要延迟解析每个元素,这样使用 DOM API 的现有代码就不必更改。
对于这个问题,我想到了两种可能的方法:
- 解析惰性 XML,每次调用
getChildren()
都会解析下一段 XML。 - 解析整个 XML 树,但将您现在不使用的内容缓存在磁盘上。
其中两种方法是可以接受的,是否有现成的解决方案。
我正在寻找本地解决方案,但我对了解其他语言的库很感兴趣。
最佳答案
听起来你想要的是类似于 Streaming API for XML (StAX) 的东西.
虽然它不使用标准的 DOM API,但它在原则上类似于您的“getChildren()”方法。它没有 DOM 方法的内存开销,也没有回调 (SAX) 方法的复杂性。
Wikipedia page for StAX 上链接了许多实现。其中大部分用于 Java,但也有一些用于 C++ - Ambiera irrXML和 Llamagraphics 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/