我们将 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 问题吗?