我正在使用 JAXB 通过 XMLStreamReader 从非常大的 XML 文件中解组对象。
如果我要解组的 XML 元素是分隔的(通过换行符甚至单个空格),则效果很好。
如果我要解组的 XML 元素之间没有空格,那么我会丢失所有其他项目 - XML 读取器似乎会吞掉解组后的元素。
演示这一点的简化可运行示例的来源位于https://gist.github.com/dalelane/88df784c3cb74b214d5c 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>
我究竟做错了什么?如何让读者不跳过元素?
在解组调用后,仔细检查您所在的元素事件。如果XMLStreamReader
is on endElement
你需要打电话next()
作为循环的一部分,但它已经开启startElement
你不会的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)