我们的程序目前使用libxml2 DOM API(xmlReadFile
)将整个文件加载到内存中。不幸的是,这会将“大型”XML文件分解为the basic memory consumption of libxml2 DOM is about 4-5 times the base file size。
当我不想将整个树存储在内存中时,似乎libxml2提供了两个用于读取XML的API:SAX2和xmlReader。
我还没有深入研究API,但我想知道哪种情况更适合在哪种情况下使用?
注意:我需要对XML文件执行的操作是使用XML文件中的数据填充一些C ++数据结构。而这些将比(非常详细的)XML定义小很多。目前,使用xmlReadFile
和DOM API,该过程大约需要100MB内存,用于20MB XML文件。这种文件在内存中的C ++数据更像是5MB - 所以我可以从1:4到4:1,这已经有很多帮助了。
答案 0 :(得分:1)
我遵循这种方法,如果处理是稀疏的(这里和那里只需要一个元素)xmlReader更好,如果你需要处理所有元素,SAX更好。虽然,可以考虑是否要推动处理或者希望处理推送代码......
答案 1 :(得分:0)
如果您需要处理大型XML文档,那么大小将成为首要考虑因素。如你所见,20MB - >用于DOM解析的100MB,如果你比这大得多,这可能是非常昂贵的,而SAX可能是处理它的唯一方法。对于嵌入式或内存受限设备,即使是小文件也可能需要SAX。
如果您想在文件完成之前开始解析,那么SAX就是您的选择。如果您正在编写浏览器,流式XML或需要响应,那么您将需要使用SAX。
SAX更令人痛苦,如果你可以通过DOM解析来减少代码和更简单的代码,对于更简单的DOM查询,你可以避免使用状态机。如果您只关心文档中的少数字段,您甚至可以避免直接查询DOM解析器并查询XSLT。