0

我尝试通过xml.sax.handler.ContentHandler子类解析 XML 文件。解析器在以下行失败:

<desc>&#18;some_text&#15;</desc>

我收到以下错误:

xml.sax._exceptions.SAXParseException: test.xml:687338:17: reference to invalid character number

规范(http://www.w3.org/TR/xml/#sec-references)说字符&#18;&#15;是有效的。那么解析器中是否存在错误或者我做错了什么?

4

2 回答 2

1

尽管您可以对这些字符进行编码,但它们充其量仍是“不受欢迎”。有关“坏”字符的列表,请参见http://www.w3.org/TR/xml/#NT-Char。然后,请参阅这个 1.1 规范,它在某些情况下添加了一些允许的内容,作为“受限”字符。

如果文本应该能够合法地包含这些字符,那么首先对其进行编码是明智的,例如使用 base64 编码。接收器因此得到格式良好的 XML(对于 XML 1.1,它并不总是必需的,但这将使其与 1.0 兼容)。

以前我不得不自己处理一次外部提供的无效 XML,我无法控制发送者。这很乱。在我的情况下,我可以依赖某些模式,因此使用正则表达式来“修补”不当行为,但这是一个 hack:出于绝望而完成的解决方法,而不是适当的修复。

(在我的情况下,我必须处理即使是 XML 1.1 解析器也会出错的事情——发件人完全被破坏了,一堆 perl 代码使用错误的正则表达式和一些文字 <foo> 类型的字符串来生成假装的 XML——所以我再也没有看下去。)

于 2013-08-15T12:23:11.077 回答
1

Unicode 代码点 15 和 18 处的字符在 XML 1.1 中是允许的,但在 XML 1.0 中是不允许的。

看起来您的解析器不支持 XML 1.1(很多不支持)。

您要么需要获取 XML 1.1 解析器(并确保它在 XML 声明中显示 version="1.1"),要么需要修复生成格式错误的 XML 的过程。

于 2013-08-15T13:01:15.400 回答