冒号是XML标记名称中的合法第一个字符吗?

时间:2016-11-06 03:36:18

标签: xml specifications colon well-formed

根据W3C XML Recommendation,开始标记名称具有以下定义:

STag ::= '<' Name (S Attribute)* S? '>'

..其中Name是:

Name ::= NameStartChar (NameChar)*
NameStartChar ::= ":" | [A-Z] | ...

..(n.b。,表示冒号可以显示为第一个字符),表明以下内容是有效的XML文档:

<?xml version="1.0" ?><:doc></:doc>

..但我尝试使用的任何解析器都会将冒号显示为格式错误。

此外,在附录B下(虽然现在是文件的折旧部分),它明确指出:

Characters ':' and '_' are allowed as name-start characters.

..和

<?xml version="1.0" ?><_doc></_doc>

..被我尝试过的XML解析器接受。

那么,冒号是标签名中有效的第一个字符,而我使用的解析器是错误的,还是我读错了规范?

2 个答案:

答案 0 :(得分:4)

是的,在基本XML级别,冒号(:)被允许作为名称开始字符。您引用的BNF规则明确指出了这一点。

但是,除了命名空间之外,不应使用冒号W3C XML Recommendation is clear

  

注意:

     

XML建议[XML Names]中的命名空间分配了一个   含义为包含冒号字符的名称。因此,作者   除了命名空间之外,不应该在XML名称中使用冒号,   但XML处理器必须接受冒号作为名称字符。

标签的XML Namespace BNF规则基于QName,它允许名称中的冒号只在PrefixLocalPart之间分隔:

QName          ::= PrefixedName | UnprefixedName
PrefixedName   ::= Prefix ':' LocalPart
UnprefixedName ::= LocalPart
Prefix         ::= NCName
LocalPart      ::= NCName
NCName         ::= Name - (Char* ':' Char*) /* An XML Name, minus the ":" */

有人可能会问,为什么从NameStartChar开始就不会禁止结肠。如果我们幸运的话,C.M.Sperberg-McQueen可能会提供权威的解释。但是,我怀疑这是一个关于如何设计名称空间的不断发展的概念。

W3C XML建议书的first published working draft in 1996定义了STag did not allow colon

STag  ::= '<' Name (S Attribute)* S? '>'
Name  ::= (Letter | '-') (Letter | Digit | '-' | '.')*

到1998年,结肠被允许进入Name

Name  ::= (Letter | '_' | ':') (NameChar)*

以及earlier form关于冒号使用的警告:

  

注意: XML名称中的冒号字符保留用于名称空间的实验。它的意义预计是   在某些未来点标准化,此时这些文件   使用冒号进行实验可能需要更新。   (不保证XML采用任何名称空间机制   实际上将使用冒号作为名称空间分隔符。)在实践中,   这意味着作者不应该在XML名称中使用冒号,除非   作为名称空间实验的一部分,但XML处理器应该   接受冒号作为名字。

需要预期,但是当结肠首次引入标签名称时,可能还不知道确切的形式。

答案 1 :(得分:1)

允许使用非命名空间感知的XML,但在名称空间感知的XML中不允许使用它们。更具体地说,基本XML建议允许它们,但命名空间建议禁止它们。现在很少有人使用非命名空间感知的XML(我不确定解析器支持它),因此最好假设它们不被允许。