我发现了一个有趣的错误,想知道你的想法。简要背景:我编写了一个自定义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规范中那些不为人知的细微差别之一?
答案 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.克劳德的评论,我不确定这个答案是否正确。他引用的部分似乎没有引用这条规则。
这个规范确实难以解开。