1

我完全理解错误“发现无效的 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.org.apache.xerces.internal.util.ErrorHandlerWrapper。致命错误(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。

但我不敢相信我的眼睛一开始就是用这个角色编组的。

我已经编组了包含 .gz 文件部分的类,并且编组成功。当我试图解组它时,它给了我这个错误。

我使用的 marshaller 和 unmarshaller 来自 /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 不是。

4

3 回答 3

0

第三件事我忘记了...

在 XML 中作为字符串无效的字符必须转义为:

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

如果您的任何字符串可以包含它们,则它们必须被转义或包含在 CDATA 中(如果它们不在属性中)。

请参见此处: XML 中的无效字符

于 2016-12-08T15:33:03.297 回答
-1

为什么要使用编组/解组技术?首先,您有一个 Java 对象。你怎么得到的?为什么它对 XML 字符无效,但对 Java 有好处?根据要求,您有三个选择:

  1. 如果 Java 对象中的数据是正确的并且必须在 XML 中传递,则必须使用 Base64 对它们进行编码。二进制数据不能在 XML 中呈现。

  2. 如果它是错误数据并且您必须将其作为错误处理 - 在编组之前执行

  3. 如果您不需要那些无效字节 - 按照建议删除它们。

另一方面:检查您的编组器默认编码。创建编组器时,有一个属性“jaxb.encoding”。它与 unmarshaller 使用的匹配吗?即“utf-8”

marshaller.setProperty("jaxb.encoding","utf-8")
于 2016-12-08T13:58:31.257 回答
-1

您为什么不尝试删除无效字符。

在这个线程中对此进行了讨论。

检查这个线程

希望这可以帮助!!

于 2016-12-08T12:16:31.773 回答