2012-05-31 39 views
38
<!-- here is some comment -- 
          ^
          | 
        what can be here apart from '>'? 

XML似乎不喜欢' - '里面的评论。我在某处读到' - '在<! ... >内切换了一些模式,但<!-- -- -- -->(偶数的-- s)似乎也是无效的。如果它是一些历史特征,什么是“专业”部分? (“反”部分无法在评论中有--)。XML评论和“ - ”

通过不仅仅使' - >'结束评论并允许' - '在里面而使评论处理复杂化的原因是什么?

回答

31

从标准文件:

http://www.w3.org/TR/REC-xml/#sec-comments

[定义:注释可以在其他 标记文档中的任何位置出现。另外,它们可能出现在文档类型 声明中的语法所允许的地方。它们不是 文档的字符数据的一部分;一个XML处理器可能,但不一定使得它可能使应用程序检索评论文本。 对于 compatibility,字符串“ - ”(双连字符)不得在 注释中出现。]参数实体引用不得在 评论中被识别。

+0

所以“pro”与SGML兼容。 –

+1

我会称之为工程折衷。 – asawyer

16

--不允许与SGML兼容。从On SGML and HTML: - ,但 注释结束定界符(之间允许‘

空格不会被标记声明开放 分隔符的注释分隔开(‘’),并允许(” <!’) - “)和标记 声明关闭分隔符(”>“)。一个常见的错误是在评论中包含一个连字符(“---”)的 。作者应避免 将两个或更多个相邻的连字符放在注释中。

所以在SGML <!>打开和关闭“标记声明”和--打开和关闭评论。

19

这是XML中的那些愚蠢的规则之一,因为它在SGML中,而且人们不想破坏兼容性。为什么在SGML中有人猜测:可能是因为它在原始解析器中保存了三行代码。

26

也许它可能对某人有所帮助。我有一个问题,我想注释掉XML与开头的命令行参数 - :

<arg line="-v --line-break 0" /> 

所以很自然正常的方式这样

<!-- <arg line="-v --line-break 0" /> --> 

没有工作,但我发现,如果-被替换为UTF-8等效&#x002D;它可以工作并且可以在评论中容忍。

所以在我的情况下,字符串

<arg line="-v &#x002d;&#x002d;line-break 0" /> 

被正确解析,可以是评论的部分。

当然它看起来有点难看,但如果有人想保留一个字符串 - 作为他在XML中的注释 - 我认为它还是比没有好。

+14

您也可以使用转义序列'-',这是ASCII转义版本,比unicode版本短一点。 – ricovox

+1

或'-'(ascii/unicode in hex) – Vojta