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