1

我们将 JAXB 与 sTAX XMLEventReaderAPI 结合使用来解析和提取通过 REST 调用检索到的数据 xml。

InputStream responseStream = response.getEntityInputStream();
    if (responseStream != null) 
    { 

        XMLInputFactory xmlif = XMLInputFactory.newInstance();

        // stax API
        XMLEventReader xmler = xmlif.createXMLEventReader(new InputStreamReader(responseStream));

        EventFilter filter = new EventFilter() {
            public boolean accept(XMLEvent event) {
                return event.isStartElement();
            }
        };

       XMLEventReader xmlfer = xmlif.createFilteredReader(xmler, filter);
        xmlfer.nextEvent();

       // use jaxb
        JAXBContext ctx = JAXBContext.newInstance(Summary.class);
        Unmarshaller um = ctx.createUnmarshaller();


        while (xmlfer.peek() != null) {
            JAXBElement<CustomObject> se = um.unmarshal(xmler,
                    CustomObject.class);
            CustomObject = se.getValue();

        }
        responseStream.close();
    } else {
        logger.error("InputStream response from API is null. No data to process");
    }
    response.close();
}

所以基本上我们首先使用 sTAX 解析,然后使用 JAXB 解组它的CustomObject类型。稍后我们对这个CustomObject类型做其他事情。

但是我们遇到了一个问题,因为这段代码在 JBoss AS 6.1.0.Final 上执行

我们得到一个例外说"The declaration for the entity "HTML.version" must end with '>'"

似乎 sTAX 或 JAXB 正在针对 DTD/XSD 进行验证。XSD 在进行 REST 调用的同一服务器上定义。


因为我们使用的是 SUN sTAX 而不是 woodstox,所以它没有固有的 DTD/XSD 验证。没有验证,错误不能来自 sTAX 调用

那是对的吗 ?

如果问题不是 sTAX 的验证失败,那么它必须是 JAXB。

但是我不能执行以下操作:

um.setValidating(false);

因为 setValidating 是一个不推荐使用的方法。

关于如何解决这个问题的任何想法/建议?我们的假设正确吗?这可能是一个已知的 JBoss 问题吗?

4

0 回答 0