根据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解析器接受。
那么,冒号是标签名中有效的第一个字符,而我使用的解析器是错误的,还是我读错了规范?
答案 0 :(得分:4)
是的,在基本XML级别,冒号(:
)被允许作为名称开始字符。您引用的BNF规则明确指出了这一点。
但是,除了命名空间之外,不应使用冒号W3C XML Recommendation is clear:
注意:强>
XML建议[XML Names]中的命名空间分配了一个 含义为包含冒号字符的名称。因此,作者 除了命名空间之外,不应该在XML名称中使用冒号, 但XML处理器必须接受冒号作为名称字符。
标签的XML Namespace BNF规则基于QName,它允许名称中的冒号只在Prefix
和LocalPart
之间分隔:
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(我不确定解析器支持它),因此最好假设它们不被允许。