StAX with JAXB XML 解析 仅解析第一个实例
StAX with JAXB XML parsing Only Parsing first instance
你好,我有一个这样的 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;
}
来自 unmarshaller 文档(强调我的)
<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
,可能是下一个<result>
的START_ELEMENT
。
此时,您的 while
循环执行,检测到 reader 中仍有事件,因此介入并调用 xsr.next()
,这使您的解析器位于START_ELEMENT
个 <name>
,未通过您的 if
测试。
所以你的代码失败了,因为你不小心 "skip over" 打开了第二个 <result>
标签。 (如果我是对的,您的代码实际上应该跳过两个 <result>
实例中的一个)。
你好,我有一个这样的 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;
}
来自 unmarshaller 文档(强调我的)
<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
,可能是下一个<result>
的START_ELEMENT
。
此时,您的 while
循环执行,检测到 reader 中仍有事件,因此介入并调用 xsr.next()
,这使您的解析器位于START_ELEMENT
个 <name>
,未通过您的 if
测试。
所以你的代码失败了,因为你不小心 "skip over" 打开了第二个 <result>
标签。 (如果我是对的,您的代码实际上应该跳过两个 <result>
实例中的一个)。