JAXB使用XMLReader解组时的未读属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAXB使用XMLReader解组时的未读属性相关的知识,希望对你有一定的参考价值。

到目前为止,我已经使用以下代码解组XML:

JAXBContext jc = JAXBContext.newInstance(clasz);
Unmarshaller u = jc.createUnmarshaller();
StringReader reader = new StringReader(xml);
return (T) u.unmarshal(reader);

但是,由于我现在需要设置一些安全功能(例如阻止访问外部DTD,我这样做:

JAXBContext jc = JAXBContext.newInstance(clasz);
SAXParserFactory spf = SAXParserFactory.newInstance();
XMLReader xmlReader = spf.newSAXParser().getXMLReader();

// Parser feature switch
// spf.setFeature("http://xml.org/sax/features/external-general-entities", false);

InputSource inputSource = new InputSource(new StringReader(xml));
SAXSource source = new SAXSource(xmlReader, inputSource);

Unmarshaller u = jc.createUnmarshaller();
return (T) u.unmarshal(source);

奇怪的是,结果却不同。在第二种情况下,我的xml属性都没有被读取。例如,

<a with="MO2+IG4+IG5+XZ0" ned="N02">41560113</a>

对应于对象A,但其带有和ned的属性对于第二个代码是空的,而正确读取的值。

任何可能导致此问题的提示,或可能的解决方案将不胜感激。 (注意我的xml没有使用名称空间)

答案

我不完全确定为什么导致这个问题,但我已经解决了不同的问题。

所以,希望这有助于任何人:

JAXBContext jc = JAXBContext.newInstance(clasz);

XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setProperty(XMLInputFactory.IS_VALIDATING, validate);
xif.setProperty(XMLInputFactory.SUPPORT_DTD, supportDTD);
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, supportExternalEntities);
XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xml));

Unmarshaller u = jc.createUnmarshaller();
return (T) u.unmarshal(xsr);

以上是关于JAXB使用XMLReader解组时的未读属性的主要内容,如果未能解决你的问题,请参考以下文章

Jaxb:如何在解组时替换给定对象树中的类/绑定

解组非根元素时的 JAXB 模式验证

使用 Jaxb API 将 XML 解组为 Java 对象时获取 NullPointerException

Java/JAXB:根据属性将 Xml 解组为特定子类

Java - 带有可选字段的 JAXB XML 解组

最新的 Open JDK 8 JAXB 库无法解组具有包含换行符的属性的对象