Я использовал код, очень похожий на тот, что был в ответе Блейза, и недавно обнаружил, что у него есть тонкая проблема. XMLReader, который я получил от SAXParser, не был настроен для понимания пространств имен, что означало, что он неправильно обрабатывал нильские элементы, такие как
<myType>
<myIntegerElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</myType>
Вместо того, чтобы JAXB демонтировал myIntegerElement в null
целое число в Java, оно декодировалось в Integer.valueOf(0)
; важное отличие для моего кода. Решением было установить фабрику синтаксического анализатора так, чтобы она учитывала пространство имен:
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
SAXParser sp = spf.newSAXParser();
// and so on
Я нахожу это довольно удивительным, потому что, если я получу свой XMLReader, выполнив XMLReaderFactory.createXMLReader()
, то у читателя не возникнет проблем с обнуляемыми элементами, но он также не поймет XMLConstants.FEATURE_SECURE_PROCESSING.