我有一个如下所示的 XML 结构:
<root>
<index>
<item>item 1</item>
<item>item 2</item>
<!-- many more items -->
<index>
<data>
<row>
<!-- relates to item 1 -->
<cell>1</cell>
<cell>2</cell>
<!-- many more cells -->
</row>
<row>
<!-- relates to item 2 -->
<cell>3</cell>
<cell>4</cell>
<!-- many more cells -->
</row>
<!-- as many rows as there are items in the index -->
</data>
</root>
我正在尝试创建一个解析器,输出(到数据库)如下结构:
item 1 : [1, 2, ...]
item 2 : [3, 4, ...]
...
通常,我会使用 sax 解析器,构造一个 HashMap,在解析器传递索引元素时填充键,然后添加单元格数据。
但是,该文档可能包含大量数据,因此我担心会遇到内存问题。
我的问题是:如何以尽可能少的内存使用来解析文件?
我想到的一件事是构造两个 SAX 解析器,一个运行索引,另一个解析数据。问题是我不知道如何挂起一个解析器,启动另一个解析器,挂起另一个解析器,重新启动第一个解析器,依此类推。
这可能吗?或者有更好的方法来处理这个问题吗?
顺便说一句:遗憾的是,我完全无法控制 XML 的格式。
最佳答案
除了 HashMap 之外,SAX 解析器不需要在内存中保存太多内容。我将 SAX 解析索引元素以生成 List<Item>
然后对于每个项目元素,我可以从列表中删除该项目(断言它在那里,将其删除),然后添加到 Map<Item,List<Cell>>
.
您需要的内存是项目总数和每个单元格的条目。我认为您不需要比使用 SAX 进行解析时维护更多的上下文。
关于java - 关联大型 XML 文档中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7977887/