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

XML 似乎不喜欢注释中的“--”。我在某处读到“--”在<! ... >事物内部切换某些模式,但是<!-- -- -- -->(偶数个--s)似乎也无效。如果它是一些历史特征,它的“专业”部分是什么?(“对立”部分无法--在评论中包含)。

通过不只制作'-->'评论结尾并允许'--'内部使评论处理复杂化的原因是什么?

4

5 回答 5

59

从标准文件:

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

[定义:注释可能出现在文档中其他标记之外的任何位置;此外,它们可能出现在文档类型声明中语法允许的位置。它们不是文档字符数据的一部分;XML 处理器可以(但不是必须)使应用程序能够检索注释文本。为了 兼容性,注释中不得出现字符串“--”(双连字符)。] 注释中不得识别参数实体引用。

于 2012-05-31T22:32:29.880 回答
58

也许它对某人有帮助。我有一个问题,我想在 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 中的注释——我认为它仍然比没有好。

于 2014-01-02T14:29:43.860 回答
37

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

于 2012-06-01T08:00:10.873 回答
30

--不允许与 SGML 兼容。从SGML 和 HTML开始:

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

所以在 SGML 中<!打开>和关闭“标记声明”并--打开和关闭注释。

于 2012-05-31T22:39:13.967 回答
1

这个问题迟早会影响到任何喜欢在 XML 中使用注释来禁用他们不需要的内容的人。几天来,我遇到了 Spring 上下文配置无法加载的重大问题,但没有详细解释原因。问题是评论这样的内容块的习惯:

<value>ABC1</value>
<!-- <value>ABC2</value> -->
<value>ABC3</value>

注释掉它必须更改为:

<!--
    <value>ABC1</value>
    !-- <value>ABC2</value> --
    <value>ABC3</value>
-->

注释掉块中的破折号而不是被忽略,无论它们放在哪里,都弄乱了整个文件的解析。

于 2020-03-27T21:00:59.777 回答