Непрочитанные атрибуты, когда JAXB отменяет маршалинг с XMLReader - PullRequest
0 голосов
/ 12 сентября 2018

До сих пор я разбирал 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 голосов
/ 12 сентября 2018

Я не совсем уверен, почему возникла эта проблема, но я решил ее по-другому.

Итак, надеясь, что это кому-нибудь поможет:

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