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

问题描述 投票:0回答:1

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

java jaxb unmarshalling
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.