目前我正在实现一个REST客户端,它将解析XML响应消息。稍后,它将在Android设备上运行。因此,存储器和处理速度是一个很大的问题。但是,一次只能有一个XML响应,因此一次处理或保存多个XML文档不是问题。
据我所知,有三种方法可以使用Android SDK解析XML:
阅读这些不同的解析方法我得到的建议是SAX用于大型XML文件,因为它不会像DOM那样在内存中保存完整的树。
但是,我问自己千字节,兆字节,......的大小是多少?是否有实际尺寸,使用SAX或DOM无关紧要?
谢谢,
罗伯特
答案 0 :(得分:9)
没有为XML文档或DOM大小设置标准限制,因此它完全取决于主机可以处理的内容。
当您在Android上实现时,您应该假设内存非常有限,并且记住DOM,XML解析器,程序逻辑,显示逻辑,JVM和Android本身都必须适合可用内存!
根据经验,您可以预期DOM占用的内存大约是源XML文档大小的四倍。假设512MB的可用内存,目标只占用DOM的一半,最终得到512/8或实际最大64MB的XML文档。
为了安全起见,我会再次减半到32MB。因此,如果您期望这么大的文档,我会转向SAX解析!
如果您希望应用程序在大型文档上以任何速度响应,那么SAX就是您的选择。一旦读取了第一个元素,SAX解析器就可以开始返回结果,DOM解析器需要在将任何输出发送到您的程序之前读取整个文档。
答案 1 :(得分:4)
摘自this article:
DOM解析器遭受内存膨胀。对于较小的XML集,这不是一个问题,但随着XML大小的增长,DOM解析器变得越来越低效,使得它们在扩展XML方面不具有可扩展性。推送解析器是一种快乐的媒介,因为它们允许您控制解析,从而消除任何类型的复杂状态管理,因为状态始终是已知的,并且它们不会遭受DOM解析器的内存膨胀。
这可能是SAX推荐使用DOM的原因:SAX作为XML推送解析器。另外,请查看有关SAX here的维基百科文章。
编辑:要专门针对大小,您必须查看您的实现。基于Java的XML解析器的内存中的DOM Document
对象大小的示例是here。与许多语言一样,Java定义了一些基于内存的限制,例如JVM heap size,Android Web服务/ XML DOM API也可以根据程序员的判断定义一些内部限制(在{{3部分中提到) }})。关于允许的最大尺寸,没有一个确定的答案。
答案 2 :(得分:1)
我的经验让我说使用DOM所使用的内存是文件大小的2倍,但当然它只是一个指示。如果XML树只有一个包含整个数据的字段,则使用的内存类似于文件大小!