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

时间:2018-09-12 10:00:30

标签: java jaxb unmarshalling

到目前为止,我一直在使用以下代码解组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没有使用名称空间)

1 个答案:

答案 0 :(得分:0)

我不太确定为什么会导致此问题,但是我以不同的方式解决了它。

因此,希望这对任何人都有帮助

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);