【问题标题】:How to tell Java SAX Parser to ignore invalid character references?如何告诉 Java SAX Parser 忽略无效字符引用?
【发布时间】:2011-03-01 03:33:28
【问题描述】:

当尝试使用 &#x1 等字符引用解析不正确的 XML 时,Java 的 SAX 解析器会因致命错误而死去,例如

    org.xml.sax.SAXParseException: Character reference "&#x1"
                                   is an invalid XML character.

有没有办法解决这个问题?在将 XML 文件交给 SAX 解析器之前,我是否必须清理它?如果是这样,有没有一种优雅的方式来解决这个问题?

【问题讨论】:

    标签: java xml error-handling sax


    【解决方案1】:

    这是无效的 XML,因此任何解析器都不应正确解析它。

    但您确实会在现实世界中遇到这种手工制作的无效 XML。我的解决方案是手动将CDATA 标记插入数据。例如,

      <data><![CDATA[ garbage with &invalid characters ]]></data>
    

    当然,你会按原样取回数据,你必须自己处理无效字符。

    【讨论】:

    • 不。无效字符在 CDATA 部分内仍然无效。
    • 请在投反对票之前检查事实。 CDATA 中的字符引用被视为常规字符串。即使 "" 表示无效引用,但它由所有有效字符组成。我一直用几个解析器来做这件事,所以我知道我是对的。
    【解决方案2】:

    使用 XML 1.1! skaffman 是完全正确的,但是您可以将&lt;?xml version="1.1"?&gt; 粘贴在文件顶部,您的状态会很好。如果您正在处理流,请编写一个包装器来重写或添加该处理指令。

    【讨论】:

    • 哇,它有效。使用 xml 1.1 是否有缺点或兼容性问题?
    • 查看w3.org/TR/xml11/#sec-xml11 的“XML 1.1 的基本原理和更改列表”如果我没记错的话,任何有效的 xml 1.0 文档在 xml 1.1 中都是有效的
    • 因为这对人们来说很方便,添加这个标题的一个很好的快捷方式是:docs.oracle.com/javase/1.4.2/docs/api/java/io/…
    【解决方案3】:

    恐怕您将不得不清理您的 XML。根据 XML 规范,这样的字符是无效的,否则再多的说服也无法说服解析器。

    Valid XML characters 用于 XML 1.0:

    • U+0009
    • U+000A
    • U+000D
    • U+0020U+D7FF
    • U+E000U+FFFD
    • U+10000U+10FFFF

    为了清理,您必须将数据传递给更底层的处理器,该处理器将其视为 unicode 字符流,删除那些无效的字符。

    【讨论】:

    • 唯一的问题是我必须自己对角色实体进行解码......真可惜。
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2011-12-17
    • 2018-03-06
    • 2014-03-11
    相关资源
    最近更新 更多