【发布时间】:2014-07-03 10:41:20
【问题描述】:
我正在使用 JAXB 通过 XMLStreamReader 从非常大的 XML 文件中解组对象。
如果我要解组的 XML 元素是分开的(用换行符甚至是一个空格),这可以正常工作。
如果我要解组的 XML 元素之间没有空格,我会丢失所有其他项目 - XML 阅读器似乎在解组的元素之后吞下了该元素。
在https://gist.github.com/dalelane/88df784c3cb74b214d5c 处有一个简化的可运行示例的源代码来证明这一点
有趣的是:
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
JAXBContext context = JAXBContext.newInstance(MyJAXBClass.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
boolean running = true;
while (running){
switch (reader.next()){
case XMLStreamConstants.START_ELEMENT:
if (reader.getLocalName().equals("myunmarshallobjname")){
JAXBElement<MyJAXBClass> unmarshalledObj = unmarshaller.unmarshal(reader, MyJAXBClass.class);
MyJAXBClass item = unmarshalledObj.getValue();
}
break;
case XMLStreamConstants.END_DOCUMENT:
reader.close();
running = false;
break;
}
}
每次流读取器到达一个元素的开头时,我都会将它传递给解组器以解组该片段。
如果我有以下 XML 文件,它可以工作:
<myunmarshallobjname key="one"></myunmarshallobjname> <myunmarshallobjname key="two"></myunmarshallobjname>
但如果我有物品会丢失:
<myunmarshallobjname key="one"></myunmarshallobjname><myunmarshallobjname key="two"></myunmarshallobjname>
我做错了什么?如何让读者不要跳过元素?
【问题讨论】:
-
问题出在 JAXB 还是您的代码中?您所说的需要用空格分隔的元素与您在 if 块中匹配的元素相同。
-
我确定问题出在我的代码中 - 我只是不知道我做错了什么。但是,如果我删除 unmarshall 行,START_ELEMENT 事件会像我期望的那样为每个元素触发。使用 unmarshall,它不会 - 我为每个其他元素得到一个 START_ELEMENT。