0

我们的程序目前使用 libxml2 DOM API ( xmlReadFile) 将整个文件加载到内存中。不幸的是,这在“大型”XML 文件上会失效,因为libxml2 DOM 的基本内存消耗大约是基本文件大小的 4-5 倍

当我不想将整个树存储在内存中时,似乎 libxml2 提供了两个用于读取 XML 的 API:SAX2xmlReader

我还没有深入研究 API,但我想知道在哪种情况下哪个更可取?

注意:我需要对 XML 文件做的就是用 XML 文件中的数据填充一些 C++ 数据结构。而这些又会比(非常冗长的)XML 定义小很多。目前,使用xmlReadFileDOM API 处理 20MB 的 XML 文件需要大约 100MB 的内存。这样一个文件在内存中的 C++ 数据更像是 5MB——所以我可以从 1:4 变为 4:1,这已经很有帮助了。

4

2 回答 2

1

我遵循这种方法,如果处理是稀疏的(这里和那里只需要一个元素)xmlReader 更好,如果你需要处理所有元素,SAX 更好。虽然,关于您是要推送处理还是希望处理推送您的代码的意见可能会发挥作用......

于 2013-03-21T15:07:13.550 回答
1
  • 如果您需要处理大型 XML 文档,那么大小将成为首要考虑因素。正如您所看到的 20MB -> 100MB 用于 DOM 解析,如果您得到比这大得多的成本,那可能会非常昂贵,而 SAX 可能是处理它的唯一方法。对于嵌入式或内存受限的设备,即使是小文件也可能需要 SAX。

  • 如果你想在文件完成之前开始解析,SAX 是要走的路。如果您正在编写浏览器、流式传输 XML 或需要响应能力,那么您将需要使用 SAX。

  • SAX 更痛苦,如果您可以摆脱通常会导致更少代码和更简单代码的 DOM 解析,例如,对于更简单的 DOM 查询,您可以避免使用状态机。如果您只关心文档中的少数字段,您甚至可以避免直接查询 DOM 解析器并改为查询 XSLT。

于 2017-09-14T07:24:52.580 回答