Недопустимый символ XML (Unicode: 0x3) был обнаружен при демаршаллинге после успешного маршаллинга
Я полностью понимаю ошибку "Обнаружен неверный символ XML (Unicode: 0x3)"
Причина: org.xml.sax.SAXParseException: недопустимый символ XML (Unicode: 0x3) был найден в содержимом элемента документа. в com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) ~[na:1.8.0_111] в com.sun.orgache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) ~[na:1.8.0_111] на com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400) ~[na:1.8.0_111] в com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) ~[na:1.8.0_111] на com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472) ~[na:1.8.0_111] на com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2923) ~[na:1.8.0_1
Но я не могу поверить своим глазам, что это в первую очередь связано с этим персонажем.
Я упорядочил класс, в котором содержались части файла.gz, и упорядочение прошло успешно. Когда я попытался разобрать его, это дало мне эту ошибку.
Я использовал маршаллера и демаршаллера из /com/sun/xml/internal/bind/v2/runtime/ - rt.jar.
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(object, stringWriter);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.unmarshal(new StringReader(stringWriter.toString()));
Это очевидная проблема рефлексивности, и я не знаю, как с ней бороться.
Любой, у кого была такая же проблема, пожалуйста, посоветуйте, как ее преодолеть, надеюсь, без смены маршаллера.
PS Насколько я понимаю, маршаллеры всегда должны быть рефлексивными и не маршалировать то, что не может маршалировать. Обидно, что rt.jar один не так.
3 ответа
Третье, что я забыл об этом...
Есть недопустимые символы, которые должны быть в XML как строка и должны быть экранированы как:
< <
> >
& &
for attribute values only:
" "
' '
Если какая-либо строка может иметь их, они должны быть либо экранированы, либо включены в CDATA, если они не входят в атрибуты.
см. здесь: недопустимые символы в XML
Почему бы вам не попробовать удалить недействительные символы.
Обсуждение этого было сделано в этой теме.
Надеюсь это поможет!!
Зачем делать это с помощью техники маршаллина / демаршалинга? Сначала у вас есть объект Java. Как ты получил это? и почему он имеет недопустимый для символа XML, но хорошо для Java? В зависимости от требований у вас есть три варианта:
Если данные в Java-объекте верны и должны быть переданы в XML, вы должны кодировать их с помощью Base64. Двоичные данные не могут быть представлены в XML.
Если это неверные данные, и вы должны обработать их как ошибку - сделайте это перед сортировкой
Если вам не нужны эти недействительные байты - удалите их, как предложено.
С другой стороны: проверьте кодировку маршаллера по умолчанию. Когда вы создаете маршаллер, есть свойство "jaxb.encoding". Соответствует ли оно тому, что использует unmarshaller? то есть для "UTF-8"
marshaller.setProperty("jaxb.encoding","utf-8")