java - StAX 与 JAXB XML 解析 仅解析第一个实例

标签 java xml jaxb stax

嗨,我有一个像这样的 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/

相关文章:

java - Java Graphics2D 是否有最大字体大小?

项目中 Java 自动生成的 getter-setters - 最佳实践

java - 可以将 jaxb 对象转换为 org.w3c.dom.Element 吗?

java - AIR native 进程性能

java - 如何将数组文件发送到其他类

xml - 用于转换数据的 XQuery 与 XSLT

xml - 使用 xslt 将字符转换为 xml 节点

java - spring mvc 错误: class <> nor any of its super class is known to this context

java - 在 Eclipse 中自动导入新的 Maven 模块

asp.net - XML 解析错误 : no element found Location: http://localhost:8000/web. 配置行号 1,列 1