2009-04-08 76 views
4

我一直在努力确认自己对XML规范的阅读。我的解释是,预先定义的实体和数字字符引用未在标签名称中不允许和属性的名称,例如这不是由XML 1.0规范:格式良好的XML?标记名称和属性名称中的XML引用

<root> 
<test&apos;&#x27;&#39;tag test&apos;&#x27;&#39;attribute="one"/> 
</root> 

但是允许的,我有一个解析器返回test'''tag的标签名称和test'''attribute了属性名称,而另一个分析器返回test&apos;&#x27;&#39;tag的标签名称和test&apos;&#x27;&#39;attribute的属性名称。

哪个解析器是正确的?或者他们都错了(即他们应该抛出一个良好的错误)?

谢谢!

+0

你有一些好的解析器在那里!我掌握的每个XML解析器都正确地确定上述示例不合格。 – bobince 2009-04-09 01:23:54

回答

2

这很简单:没有实体可以在名称内使用。这两个“解析器”都是错误的。 XML规范相当明确地定义了这一点 - 没有隐藏的默认规则;如果某个构造不包含在内,则不允许。

实体只能在常规字符内容和属性值内使用。它们可以包含在其他一些地方(注释,处理指令,DTD子集),但不会被扩展(即不被识别为实体)。

0

。在w3.org周围挖掘,我发现下面的相关部分:

[41]属性:: =姓名式AttValue [VC:属性值类型] [WFC:无外部实体引用] [WFC :无外部实体引用]链接:

规范性约束:无外部恩在属性值]

[WFC没有<实体参考文献
属性值不能包含对外部实体的直接或间接实体引用。

名称链接到:

[5]名称:: = 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-#xEFFFF]

[4a] NameChar :: = NameStartChar | “ - ”| “” | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

是的,它就像泥土一样清晰!我对此的解释是,只要它们落在上面指定的范围内,就可以使用十六进制实体引用,但不能使用预定义的引用。

当名称不符合这个要求时,我会期待一个格式良好的错误。

+0

谢谢,26的17! 我实际上倾向于根本没有实体引用,因为&似乎完全不允许(参见dommer的回答)。 – ScottProuty 2009-04-08 20:04:58

+0

我当然从未见过他们以这种方式使用,并亲自将避免它。 – 2009-04-08 21:05:24

2

在我看来,他们都是错的。按照spec,只有下列字符应该是一个开始标记:

":" | [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. 

您正在使用什么解析器?