【问题标题】:An invalid XML character (Unicode: 0x3) was found on unmarshalling after successful marshalling成功编组后在解组时发现无效的 XML 字符 (Unicode: 0x3)
【发布时间】:2017-04-23 16:04:00
【问题描述】:

我完全理解错误“找到了无效的 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.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_111]

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

我已经编组了包含部分 .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()));

这是明显的反身性问题,我不知道如何处理。

任何遇到同样问题的人,请告知如何克服它,希望无需更改编组器。

附:据我了解,编组者应该始终具有自反性,不要编组无法解组的事物。可惜没有 rt.jar。

【问题讨论】:

    标签: java xml jaxb marshalling rt.jar


    【解决方案1】:

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

    对此的讨论已在此线程中进行。

    check this thread

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回复,但这并不是那么简单——如果我不能解组,我需要失败,而不是简单地删除坏字符。我考虑解组编组的实体,如果没有抛出异常,则继续。此外,也许有一些方法可以让 JAXB 实现走上正轨——正如我所说,它只是必须是自反的。
    【解决方案2】:

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

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

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

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

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

    marshaller.setProperty("jaxb.encoding","utf-8")
    

    【讨论】:

    • 是的,编码是统一的。我只想在我的字符串字段中包含任何字符串,因此没有业务逻辑方面的验证。 Base64 编码不好。无论如何,我们正在转向 json。
    • 二进制 XML 或 JSON 没有其他方法。两者都是基于字符串的协议。您打算如何处理 JSON 中的二进制数据?
    • 如果你有字符串,你从哪里得到二进制字节? 0x03 不是字符。
    • 你在编组的 XML 的第一行中有什么?
    【解决方案3】:

    第三件事我忘了...

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

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

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

    请看这里: Invalid Characters in XML

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2011-09-05
      • 2013-09-10
      • 1970-01-01
      • 2012-09-28
      • 2012-12-02
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多