JAXB如何推进XMLStreamReader?

dal*_*ane 4 java xml jaxb

我正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

每当流阅读器点击元素的开头时,我都会将它传递给unmarshaller以解组该片段.

如果我有XML,它可以工作:

<myunmarshallobjname key="one"></myunmarshallobjname> <myunmarshallobjname key="two"></myunmarshallobjname>
Run Code Online (Sandbox Code Playgroud)

但如果我有以下情况,则丢失物品:

<myunmarshallobjname key="one"></myunmarshallobjname><myunmarshallobjname key="two"></myunmarshallobjname>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何让读者不要跳过元素?

bdo*_*han 5

在解组呼叫后,仔细检查您所在的元素事件.如果打开XMLStreamReader,endElement你将需要next()作为你的循环的一部分来打电话,但它startElement不会.

  • 我分享了示例的固定版本,以防对下一个人尝试此操作有所帮助。https://gist.github.com/dalelane/983f278d2485d29a6ef4 (2认同)