我使用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;
}
}
每次流阅读器点击元素的开头时,我都会将它传递给unmarshaller以解组该片段。
如果我使用XML,那么它可以工作:
<myunmarshallobjname key="one"></myunmarshallobjname> <myunmarshallobjname key="two"></myunmarshallobjname>
但如果我有以下情况则会丢失物品:
<myunmarshallobjname key="one"></myunmarshallobjname><myunmarshallobjname key="two"></myunmarshallobjname>
我做错了什么?如何让读者不要跳过元素?
答案 0 :(得分:5)
仔细检查解组调用后您所在的元素事件。如果XMLStreamReader
位于endElement
,您需要在循环中调用next()
,但它不会startElement
。