【问题标题】:StAX with JAXB XML parsing Only Parsing first instanceStAX with JAXB XML parsing Only Parsing first instance
【发布时间】:2015-05-12 04:07:26
【问题描述】:

您好,我有一个这样的 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;

}

【问题讨论】:

    标签: java xml jaxb stax


    【解决方案1】:

    来自 unmarshaller 文档(重点是我的)

     JAXBElement Unmarshaller.unmarshal(XMLStreamReader reader, Class declaredType)

    将根元素解组到 JAXB 映射的 declareType 并返回结果内容树。

    此方法通过声明类型实现解组。

    此方法假定解析器在 START_DOCUMENT 或 START_ELEMENT 事件上。将从这个开始事件到相应的结束事件进行解组。如果此方法成功返回,阅读器将在结束事件之后立即指向令牌。

    我们可以从您的示例中看到,unmarshal 调用始于 START_ELEMENT 事件,因此当调用完成时,reader 将在下一个事件之后@ 987654324@,可能是下一个&lt;result&gt;START_ELEMENT

    此时,您的while 循环执行,检测到阅读器中仍有事件,因此介入并调用xsr.next(),这使您的解析器位于START_ELEMENT&lt;name&gt;,这将失败你的if 测试。

    所以您的代码失败了,因为您不小心“跳过”了第二个 &lt;result&gt; 标记的开头。 (如果我是对的,您的代码实际上应该跳过两个 &lt;result&gt; 实例中的一个)。

    【讨论】:

    • 这完全有道理,你是对的。非常感谢
    • 根据您的实际输入 XML,您的代码可能有效(如果解析器将空格报告为不同的 XML 事件,则您的代码可能有效,因此确实很难跟踪该错误)。
    • 是的,我知道是怎么回事。我差点把头发拔了,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2012-07-16
    • 2019-04-26
    • 2012-01-11
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多