我正在Android中开发一个应用程序,我需要遍历一个xml文件。
我需要遍历xml - 从给定位置向后和向前移动。这意味着我开始解析文件,但在每个瞬间我都可以停下来然后向后或继续。
我正在考虑使用DOM,它的循环我可以控制它并做我想要的。但是我要解析的xml文件至少有8 Mb,因为DOM非常耗费内存,所以似乎不是一个好的解决方案。
此问题的解决方案是不加载整个文档进行解析。喜欢将文档分成几个部分,只将一个部分加载到内存并进行解析。当我到这个部分结束时,我加载另一个。当我想倒带时也一样。
我的问题是,我如何实现将文件分成几部分。因为它是一个xml文件而且孩子的大小不一样吗?
例如:
<root>
<child time="A">
<sub1>1</sub1>
<sub2>2</sub2>
</child>
<child time="B">
<sub1>3</sub1>
</child>
<child time="C">
<sub2>4</sub2>
</child>
</root>
正如您所看到的,他们的孩子有不同的尺寸,我不知道如何在几个部分中有效地分割这样的文件。
有人能给我一些线索吗?
最好的问候。
答案 0 :(得分:2)
使用XML,您通常需要做出选择。 DOM是内存密集型的,SAX不能倒退,手工解析器的创建和维护也很繁琐。
如果你能承受消耗数十亿的内存,那么就单独使用DOM。
SAX和手动解析之间的决定取决于您实际需要反向的频率以及此时是否可以承受延迟。
如果不能,则必须使用预计算实现手工制作的解析器。例如,可以使用SAX(与CountingInputStream结合使用)或手动执行预计算。您可以预先计算每个n
- child
元素的起始和结束偏移量,并将其存储为如下所示的间隔数组:
public class Interval {
public int startOffset;
public int endOffset;
}
Interval[] precomputedOffsets;
页面大小n
的值可能类似于20.平衡控制内存消耗与返回性能之间的权衡。
现在,如果您知道需要在运行时转到项i
,则会在输入流上调用reset
和skip(precomputedOffsets[i / n])
,并手动解析{{1}来自那里的剩余i % n
元素。