java - 关联大型 XML 文档中的数据

标签 java sax

我有一个如下所示的 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/

相关文章:

java - cordova 构建问题 - javac - 版本无法运行

java - 验证发生时 + 符号从 xml 中删除

java - 线程 "main"java.net.MalformedURLException : unknown protocol: c 中的异常

java - Servlet 中 JSON 的解析器就像 XML 的 SAX 一样

java - NoSuchFieldError - 是否可以在同一应用程序中同时包含 httpclient-4.3.3 jar 和 httpclient-4.2.5 jar

java - Java 中的密码安全 - 将 char[] 转换为 String

Netbeans 中的 Java 代码可以工作,但通过 cmd 提示符执行 jar 会出现 nosuchmethod 错误异常

java - 匿名类在 Java 中获取 final 变量的浅拷贝还是深拷贝?

java - 在java中使用sax解析器(Xerces)时的简单疑问

java - 如何在 Java 中删除 XML 命名空间