将元素添加到巨大的XML文件中

时间:2011-04-06 17:04:29

标签: java xml memory

我遇到了Java和XML的问题:我必须在巨大的 XML文件中添加一些元素,但当我以这种方式阅读时,我有一个OutOfMemory错误(Nota:我无法修改最大内存大小)

SAXBuilder sxb = new SAXBuilder();
document = sxb.build(xmlFile);
root = document.getRootElement();
myElement = root.getChild("myElement");

似乎这段代码“挂载”了内存中的所有XML元素。有人知道一个Java库,它允许我在没有太多内存使用的情况下将元素添加到XML文件中吗?

例如,我想要这个XML文件:

<root>
    <group>
        <element>Some data</element>
        ...
        <element>Some other data</element>
    </group>
</root>

成为:

<root>
    <group>
        <element>Some data</element>
        ...
        <element>Some other data</element>
        <element>Data added at the end of the group</element>
        ...
        <element>Other data added at the end of the group</element>
    </group>
</root>

谢谢:)

编辑:

  

要插入您的元素,您将拥有   使用SAX解析器处理文件,   并写出来插入   适当的新元素。

经过多次搜索后,我还没有找到如何使用SAX写回我的新元素。它似乎是一种只读方法。你怎么会处理这个问题?

2 个答案:

答案 0 :(得分:3)

SAXBuilder有点混乱似乎是一个带有SAX输入源的DOM解析器。正如您所发现的,您不希望使用DOM解析器来处理大型文件,否则您将遇到内存问题:因为DOM解析器正在构建文档中的所有元素,因此需要将整个文件读入内存。您想要使用的是一个实际的SAX解析器 - 拥有一个Google,有各种各样的实现。

SAX解析器是基于事件的:它不构造DOM元素,只是在遇到开始标记时,只读取文件逐个字符的触发事件(即调用用户 - 供应商处理程序的各种方法),结束标记和实际文本内容。因此,内存开销非常低;你可以处理你喜欢的任何大小的文件。

SAXParser的缺点是你不能迭代或查询DOM,你必须跟踪你在文档中的位置,你在哪个元素等等。

要插入元素,您必须使用SAX解析器处理文件,并在适当时插入新元素将其写回。

编辑:昨天的这个question有一个使用SAX解析器处理文件的简单示例。

答案 1 :(得分:1)

您想使用真正的SAX解析器,例如Apache Xerces2

Sax引擎是一种事件驱动的XML解析器,使用与DOM解析器不同的方法。要使用SAX,您必须从第一个开始依次遍历XML元素。

在散步期间,无论是什么,你都会去做你的工作。例如,您希望序列化您要解析的XML文档,但在某些点添加一些其他元素。

从此tutorial开始。