Недопустимый символ 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 как строка и должны быть экранированы как:

<   &lt;
>   &gt;
&   &amp;
 for attribute values only:
"   &quot;
'   &apos;

Если какая-либо строка может иметь их, они должны быть либо экранированы, либо включены в CDATA, если они не входят в атрибуты.

см. здесь: недопустимые символы в XML

Почему бы вам не попробовать удалить недействительные символы.

Обсуждение этого было сделано в этой теме.

проверить эту тему

Надеюсь это поможет!!

Зачем делать это с помощью техники маршаллина / демаршалинга? Сначала у вас есть объект Java. Как ты получил это? и почему он имеет недопустимый для символа XML, но хорошо для Java? В зависимости от требований у вас есть три варианта:

  1. Если данные в Java-объекте верны и должны быть переданы в XML, вы должны кодировать их с помощью Base64. Двоичные данные не могут быть представлены в XML.

  2. Если это неверные данные, и вы должны обработать их как ошибку - сделайте это перед сортировкой

  3. Если вам не нужны эти недействительные байты - удалите их, как предложено.

С другой стороны: проверьте кодировку маршаллера по умолчанию. Когда вы создаете маршаллер, есть свойство "jaxb.encoding". Соответствует ли оно тому, что использует unmarshaller? то есть для "UTF-8"

marshaller.setProperty("jaxb.encoding","utf-8")
Другие вопросы по тегам