Tilde在XML公共标识符中无法识别

时间:2010-05-14 13:25:36

标签: java xml utf-8 sax doctype

我发现了一个有趣的错误,想知道你的想法。简要背景:我编写了一个自定义DTD和一个示例XML文件(都是UTF-8)。我现在已经用Java实现了一个SAX解析器,我想测试它。我收到一个SAXException抱怨“在公共标识符中找到了无效的XML字符(Unicode:0x7e)”。现在,我的DTD的URL确实包含一个波形符(unicode 0x7e)。如果我将DTD文件移动到另一个不包含波浪号的URL,那么我的示例XML文件将解析而不会导致SAXException。

所以我有解决这个问题的方法,但我很想知道:为什么会这样?这是一个错误吗?如果是这样,它是UTF-8,Java(1.6.0_18 x86),Windows(Server 2008 R2 x86_64)还是什么?或者这是XML 1.0规范中那些不为人知的细微差别之一?

2 个答案:

答案 0 :(得分:3)

您通常不会在公共标识符中放置URI(包含~)。系统标识符通常是URI。

我怀疑你在说:

<!DOCTYPE PUBLIC "http://www.example.com/~foo/x.dtd">

当你的意思是:

<!DOCTYPE SYSTEM "http://www.example.com/~foo/x.dtd">

答案 1 :(得分:1)

这是XML 1.0规范的一个模糊的细微差别。我喜欢这句话!

我相信Extensible Markup Language (XML) 1.0 (Fifth Edition)

中的“生产13”
  

[13] PubidChar :: =#x20 | #xD | #xA | [a-zA-Z0-9] | [ - '()+,/:?!= *#@ $ _%]

定义此处允许的字符集。

现在我见过T.J.克劳德的评论,我不确定这个答案是否正确。他引用的部分似乎没有引用这条规则。

这个规范确实难以解开。