【发布时间】:2011-12-13 12:47:53
【问题描述】:
我试图读取一个大的 xml 文件(大约 500MB)。 首先,我将 xjc 与我的 XML 的 XSD 文件一起使用。所有类都按预期生成。 尝试读取文件时出现此错误:javax.xml.bind.UnmarshalException: unexpected element.
这是我的代码:
(...)
JAXBContext context = JAXBContext.newInstance("br.com.mypackage");
Unmarshaller unmarshaller = context.createUnmarshaller();
File f = new File("src/files/MyHuge.CNX");
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
InputStream in = new FileInputStream(f);
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
Person p = null;
int count = 0;
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
if (startElement.getName().getLocalPart() == ("person")) {
p = (Person) unmarshaller.unmarshal(eventReader);
}
}
}
问题在于解组操作。
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"identification"). Expected elements are <{}messageAll>
我以这个链接为例来制作我自己的代码:JAXB - unmarshal OutOfMemory: Java Heap Space
有人有线索吗?我现在想要的只是读取一个巨大的 XML 文件,而无需解组 XML 的外部对象(java 堆空间问题),也无需逐个读取标签获取相应的值,一个缓慢而猴子的代码(不是星球崛起的猴子猿)。 :P
非常感谢。
【问题讨论】:
-
你能分享这里使用的 xml 和类以及它们的 jaxb 映射吗?包
br.com.mypackage中是否有注解@XmlRootElement(namespace="", name = "identification")的类 -
Arun,在 Person 类上,有这个注解:
@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "", propOrder = {"identification","address","whatever"})所以,我认为 XJC 会做所有与注解相关的小事。可能是 XSD 文件的问题? -
您能在将事件阅读器的内容传递给解组器之前尝试打印它吗?看起来不是在根处传递
person元素,而是在传递identification元素。而Person类应该有@XmlType(name = "person", propOrder = {"identification","address","whatever"})。能否也给出识别对象的类型。 -
我做了一个测试。我试图“解组”标识对象。它不起作用。它启动相同的异常: 引起:javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“标识”)。预期元素是 我编辑了删除人员的 XML 文件。我只留下了 5 个人。有了这个小文件,我成功地使用 XJC 生成的最外部对象进行了解组操作。所有 5 个人都按预期创建。通过这个测试,我认为这不是注释问题。 (我怎样才能把 xsd 文件发给你?)