До сих пор я разбирал 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не использует пространства имен)