我在 EclipseLink MOXy 上度过了一段愉快的时光,找出了在 Spring 中将 XML 解析为 POJO 的最佳方法。我现在得到了一些要解析的 XML,文件的大小达到了令人难以置信的 750MiB。
EclipseLink MOXy 是在底层使用流技术,还是会尝试将整个文档保存在内存中?
我在 EclipseLink MOXy 上度过了一段愉快的时光,找出了在 Spring 中将 XML 解析为 POJO 的最佳方法。我现在得到了一些要解析的 XML,文件的大小达到了令人难以置信的 750MiB。
EclipseLink MOXy 是在底层使用流技术,还是会尝试将整个文档保存在内存中?
Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
Whenever possible EclipseLink JAXB (MOXy) leverages a StAX XMLStreamReader
to process the XML input. This means the document is never held in memory.
我无法评论 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...