嗨,我有一个像这样的 XML 结构:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<result>
<name>Chrome</name>
<version>2</version>
</result>
<result>
<name>IE</name>
<version>8</version>
</result>
</response>
我正在尝试使用 staxx 来通过 JAXB 解析出中间的内容。我遇到的问题是它没有获取所有结果元素。请参阅下面的内容:
输出:
response
result
name
version
如何获取所有结果对象,内部可以是我传入的任何通用对象?另外,一旦我用 jaxb 解析对象,有没有办法将 staxx 迭代器推进到 的末尾(因为一旦我有了对象,解析其余部分就没有多大意义了)。
private static <T> List<T> unmarshallCreateResponseObject(Class<T> clazz, String xml) throws JAXBException, XMLStreamException
{
List<T> list = new ArrayList<T>();
XMLInputFactory xif = XMLInputFactory.newFactory();
StringReader stringReader = new StringReader(xml);
XMLStreamReader xsr = xif.createXMLStreamReader(stringReader);
while (xsr.hasNext()) {
int eventType = xsr.next();
if(eventType == XMLStreamReader.START_ELEMENT){
System.out.println(xsr.getLocalName());
if(xsr.getLocalName().equals("result"))
{
JAXBContext jc = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement<T> jb = unmarshaller.unmarshal(xsr, clazz);
list.add(jb.getValue());
}
}
}
xsr.close();
return list;
}
最佳答案
来自解码器文档(重点是我的)
<T> JAXBElement<T> Unmarshaller.unmarshal(XMLStreamReader reader, Class declaredType)Unmarshal root element to JAXB mapped declaredType and return the resulting content tree.
This method implements unmarshal by declaredType.
This method assumes that the parser is on a START_DOCUMENT or START_ELEMENT event. Unmarshalling will be done from this start event to the corresponding end event. If this method returns successfully, the reader will be pointing at the token right after the end event.
从您的示例中我们可以看到 unmarshal
调用从 START_ELEMENT
开始事件,因此当调用完成后,reader
将在STOP_ELEMENT
之后的下一个 Activity 中进行,可能是 START_ELEMENT
下一个<result>
.
此时,您的while
循环执行,检测到阅读器中仍然有事件,因此介入并调用 xsr.next()
,这将使您的解析器处于 START_ELEMENT
的<name>
,这使您的 if
失败测试。
所以你的代码失败了,因为你不小心“跳过”了第二个 <result>
的开头标签。 (如果我是对的,您的代码实际上应该跳过两个 <result>
实例中的一个)。
关于java - StAX 与 JAXB XML 解析 仅解析第一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28968478/