我花了一些EclipseLink MOXy的愉快時間,找出了在Spring中解析XML到POJO的最佳方法。現在我已經給了一些XML來解析,並且這些文件的大小達到了令人難以置信的750MiB。EclipseLink MOXy適用於可笑的巨大XML文件嗎?
EclipseLink MOXy是否在下面使用流媒體技術,還是試圖將整個文檔放在內存中?
我花了一些EclipseLink MOXy的愉快時間,找出了在Spring中解析XML到POJO的最佳方法。現在我已經給了一些XML來解析,並且這些文件的大小達到了令人難以置信的750MiB。EclipseLink MOXy適用於可笑的巨大XML文件嗎?
EclipseLink MOXy是否在下面使用流媒體技術,還是試圖將整個文檔放在內存中?
說明:我是EclipseLink JAXB (MOXy)的領導者,也是JAXB (JSR-222)專家組的成員。
只要可能EclipseLink JAXB (MOXy)利用StAX XMLStreamReader
來處理XML輸入。這意味着文件永遠不會留在內存中。
我不能評論MOXy與任何其他JAXB實現,但取決於您的XML文件的結構和它們包含的數據類型,您可能需要考慮的不是解構整個XML的顯而易見的方法先將文件歸檔成對象,然後對其進行操作。例如,如果非常大的文件是由許多小的部分
<root>
<record>
<id>1</id>
<name>Ian</name>
</record>
<record>
<id>2</id>
<name>Deejay</name>
</record>
<!-- 100,000 more <record> elements -->
</root>
的你可以單獨處理各段使用像
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(inputStream);
JAXBContext ctx = JAXBContext.newInstance("com.example");
Unmarshaller um = ctx.createUnmarshaller();
xsr.nextTag(); // move to the <root> tag
xsr.nextTag(); // move to the first <record>
// read one <record> at a time
JAXBElement<Record> rec = um.unmarshal(xsr, Record.class);
// leaves the xsr pointing to the token after the </record> tag
// so you can do something with this Record, then discard it and
// parse the next...
布萊斯的東西 - 我一直在使用外部配置的元數據。關於如何在單個文件中對多個記錄進行「迭代」並在每個文件被解析時觸發某種事件的任何建議?否則,儘管XML不會被存儲在內存中,但POJO表示將立即堆起來。 –
@Deejay - 我認爲您正在尋找由Ian Roberts建議的方法:http://stackoverflow.com/a/13397375/383861 –