如何告诉Java SAX Parser忽略无效的字符引用?

时间:2010-06-08 12:33:06

标签: java xml error-handling sax

当尝试使用&#x1之类的字符引用解析不正确的XML时,Java的SAX Parser因致命错误而死亡,例如

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

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

3 个答案:

答案 0 :(得分:23)

使用XML 1.1! skaffman是完全正确的,但你可以将<?xml version="1.1"?>放在文件的顶部,你就会处于良好的状态。如果您正在处理流,请编写一个重写或添加该处理指令的包装器。

答案 1 :(得分:7)

我担心你必须清理你的XML。根据XML规范,这些字符是无效的,否则没有多少说服力会说服解析器。

对于XML 1.0

Valid XML characters

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

为了清理,您必须通过更低级别的处理器传递数据,该处理器将其视为unicode字符流,删除那些无效的字符。

答案 2 :(得分:2)

这是无效的XML,因此解析器不应该在没有错误的情况下对其进行解析。

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

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

当然,您将按原样获取数据,并且您必须自己处理无效字符。