1

我在 EclipseLink MOXy 上度过了一段愉快的时光,找出了在 Spring 中将 XML 解析为 POJO 的最佳方法。我现在得到了一些要解析的 XML,文件的大小达到了令人难以置信的 750MiB。

EclipseLink MOXy 是在底层使用流技术,还是会尝试将整个文档保存在内存中?

4

2 回答 2

4

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.

于 2012-11-15T11:50:54.373 回答
3

我无法评论 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...
于 2012-11-15T12:15:31.683 回答