我遇到了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写回我的新元素。它似乎是一种只读方法。你怎么会处理这个问题?
答案 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开始。