我一直在努力确认我对XML规范的阅读。我的解释是标签名称和属性名称中不允许使用预定义的实体和数字字符引用,例如,XML 1.0规范不允许这样做:
<root>
<test'''tag test'''attribute="one"/>
</root>
但是,我有一个解析器为标记名称返回 test'''tag
,为属性名称返回 test'''attribute
,而另一个解析器返回 test'''tag
,属性名称为 test'''attribute
。
哪个解析器是正确的?或者它们都是错的(即它们应该抛出一个形成错误的错误)?
谢谢!
答案 0 :(得分:2)
在我看来,他们都错了。根据{{3}},只有以下字符应位于开始标记中:
":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
XMLSpy当然也不满意。也不<氧气/>。
而且......只是为了好的衡量......这就是.NET必须说的:
The '&' character, hexadecimal value 0x26, cannot be included in a name. Line 1, position 12.
您使用的解析器是什么?
答案 1 :(得分:2)
这非常简单:名称中不能使用任何实体。这两个“解析器”都是错误的。 XML规范非常明确地定义了这一点 - 没有隐藏的默认规则;如果不包括某些构造,则不允许。
实体只能在常规字符内容和属性值中使用。它们可以包含在其他一些地方(注释,处理指令,DTD子集),但不会被扩展(即不被识别为实体)。
答案 2 :(得分:0)
在w3.org挖掘时,我发现了以下相关内容:
[41] Attribute :: = Name Eq AttValue [VC:属性值类型] [WFC:无外部实体引用] [WFC:No&lt;在属性值]
[WFC:No External Entity References]链接到:
良构性约束:无外部实体参考
属性值不得包含对外部实体的直接或间接实体引用。
名称链接到:
[5] Name :: = NameStartChar(NameChar)*
[4] NameStartChar :: =“:”| [A-Z] | “_”| [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xFFFF]
[4a] NameChar :: = NameStartChar | “ - ”| “” | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
是的,它像泥一样清晰!我对此的解释是,只要它们落在上面指定的范围内,你就可以使用十六进制实体引用,但是你不能使用预定义的引用。
当名称不符合这一点时,我希望格式错误。