XML注释和“--”

93
<!-- here is some comment --
                            ^
                            |
                    what can be here apart from '>'?

XML不喜欢在注释中放置“--”。我在某个地方读到,“--”会在<! ... > 中切换一些模式,但是<!-- -- -- --> (偶数个--)似乎也是无效的。如果这是一些历史特性,那么其中的“正面”部分是什么?(“反面”部分是无法在注释中使用--)。

为什么不只让“-->”作为注释结束符,并允许在注释内部使用“--”来简化注释处理呢?

5个回答

69

也许对某些人会有帮助。我遇到了一个问题,我想在以--开头的XML命令行参数中注释掉:

也许这对一些人有用。我曾遇到一个问题,需要将以“--”开头的命令行参数在XML文件中注释掉:

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

所以自然而然的正常方式就是这样

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

没起作用,但我发现,如果把-替换为它的UTF-8等效形式&#x002D;&#45;,就可以在注释内使用。

因此,在我的情况下,字符串

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

被正确解析并且可以作为注释的一部分。

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


29
你也可以使用转义序列 &#45;,它是 ASCII 转义版本,比 Unicode 版本略短。 - drwatsoncode
2
哈哈,大家都在抱怨,而你提出了一个优雅明显的解决方案。太棒了! - Chris Bordeman
5
你也可以只替换第二个连字符,即将“--”替换为“--”。 - IS4
当我在Firefox中打开XML时,连字符仍然显示为&#45;而不是- - akostadinov
当我在Firefox中打开XML文件时,连字符仍然显示为&#45;而不是- - undefined

67

这是标准文档中的内容:

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

[定义: 注释可以出现在文档中除其他标记之外的任何位置; 此外,它们可能会出现在文档类型声明中,允许语法规定的位置。 它们不是文档的字符数据; XML处理器可能会但不需要使应用程序能够检索注释的文本。为了兼容性,注释中不能出现字符串"--"(双短横线)。 参数实体引用不能在注释中被识别。


所以,“pro”是与SGML兼容。 - Vi.
2
我会称之为一种工程上的权衡。 - asawyer
13
我认为应该进行更改,因为现在我们有了以双破折号开头的CSS参数,并且可以在SVG元素的style属性内部使用。注释掉这些元素将会破坏与XML标准的兼容性,而这只是因为一些已经不存在的旧格式。 - Waruyama
3
但愿它能够改变!不幸的是,就像 XML 1.1 的痛苦经历一样,改变规范是一回事;让人们更新20年前编写的解析器是另一回事。而且,让世界充满实现标准不同版本的解析器并不能帮助任何人。 - Michael Kay

43

这是一个愚蠢的规则,它在 XML 中存在,因为它在 SGML 中也存在,并且人们不想破坏兼容性。为什么它在 SGML 中存在只有上帝知道:可能是因为它在原始解析器中节省了三行代码。


35

--不允许出现,为了与SGML兼容。来源于关于SGML和HTML

在标记声明开放分隔符("<!")和注释开放分隔符("--")之间不允许存在空格,但是在注释关闭分隔符("--")和标记声明关闭分隔符(">")之间可以存在空格。常见的错误是在注释中包含一串连字符("---")。作者应该避免在注释中放置两个或更多相邻的连字符。

因此,在 SGML 中,<!> 分别是“标记声明”的开放和关闭标记,“--”则是注释的开放和关闭标记。


0
这个问题迟早会影响到所有喜欢使用XML注释来禁用他们不需要的内容的人。我经历了几天严重的问题,Spring上下文配置无法加载,却没有任何详细的解释原因。 问题在于习惯性地像这样注释一些内容块:
<value>ABC1</value>
<!-- <value>ABC2</value> -->
<value>ABC3</value>
注释掉,它必须被更改为这个:
<!--
    <value>ABC1</value>
    !-- <value>ABC2</value> --
    <value>ABC3</value>
-->

注释块中的破折号不应被忽略,无论放置在何处,都会破坏整个文件的解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接