我目前正在尝试使用JAXB来解组一个XML文件,但是似乎这个XML文件太大了(约500MB),无法被解组器处理。我一直收到 java.lang.OutOfMemoryError: Java heap space
错误提示。
Unmarshaller um = JAXBContext.newInstance("com.sample.xml");
Export e = (Export)um.unmarhsal(new File("SAMPLE.XML"));
我猜测这是因为它试图将大的XML文件作为对象打开,但该文件对于Java堆空间来说过于庞大。
是否有其他更“内存高效”的解析大型XML文件的方法,即约500MB?或者可能有一个unmarshaller属性可以帮助我处理大型XML文件吗?
这是我的XML文件的样子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- -->
<Export xmlns="wwww.foo.com" xmlns:xsi="www.foo1.com" xsi:schemaLocation="www.foo2.com/.xsd">
<!--- --->
<Origin ID="foooo" />
<!---- ---->
<WorkSets>
<WorkSet>
<Work>
.....
<Work>
....
<Work>
.....
</WorkSet>
<WorkSet>
....
</WorkSet>
</WorkSets>
我希望能够在WorkSet级别进行反序列化,同时仍然能够阅读每个WorkSet中的所有工作。
(Person) unmarshaller.unmarshal(xsr);
。这样正确吗? - TyCXMLStreamReader
只会以深度优先的顺序为我们提供访问 XML 事件的权限。关键在于我们需要识别出我们想要 JAXB 进行反编组的 XML 片段的起始元素状态。JAXB 将会将XMLStreamReader
推进到该元素的末尾。然后,我们寻找下一个要进行反编组的片段。 - bdoughanwhile(xsr.nextTag() == XMLStreamConstants.START_ELEMENT)
。一旦它到达这里,程序就会输出 null。我已经更新了我的 XML,是因为在到达WorkSet
或者你的情况下的Person
之前,它碰到了其他元素吗? - TyCXMLStreamReader
来使事情变得正确。你可以询问XMLStreamReader
当前节点的名称,以查看遍历的位置。 - bdoughan