XML注释和" - "

Vi.*_*Vi. 59 xml comments

<!-- here is some comment --
                            ^
                            |
                    what can be here apart from '>'?
Run Code Online (Sandbox Code Playgroud)

XML似乎不喜欢评论中的" - ".我在某处读到' - '切换内部<! ... >的一些模式,但是<!-- -- -- -->(甚至数量的--s)似乎也是无效的.如果它是一个历史性的特征,它的"专业"部分是什么?("反对"部分无法--发表评论).

是什么原因导致评论处理变得复杂,因为不仅仅是" - >"结束评论并允许" - "在内部?

asa*_*yer 47

从标准文件:

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

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

  • 这应该改为IMO,因为我们现在有css参数,它以双连字符开头,可以在SVG元素的style属性中.注释掉这些元素将破坏与XML标准的兼容性,只是因为某些遗留格式不再存在. (4认同)
  • 要是能改变就好了!不幸的是,正如 XML 1.1 的痛苦经历所表明的那样,改变规范是一回事;改变规范是一回事。让人们更新 20 年前编写的解析器是另一回事。世界上充满了实现不同版本标准的解析器,这对任何人都没有帮助。 (3认同)
  • 我称之为工程权衡。 (2认同)

Dan*_*iel 40

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

<arg line="-v --line-break 0" />  
Run Code Online (Sandbox Code Playgroud)

所以这种自然正常的方式

<!-- <arg line="-v --line-break 0" /> -->
Run Code Online (Sandbox Code Playgroud)

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

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

<arg line="-v &#x002d;&#x002d;line-break 0" />
Run Code Online (Sandbox Code Playgroud)

被正确解析,可以成为评论的一部分.

当然它看起来有点难看,但如果有人想要保留一个字符串 - 作为他的XML中的评论 - 我认为它仍然比没有好.

  • 您还可以使用转义序列`&#45;`这是ASCII转义版本,并且比unicode版本略短. (21认同)
  • 呵呵,大家都在抱怨,你想出了一个优雅而明显的解决方案。太棒了。 (2认同)
  • 您也可以仅替换第二个连字符,即将“--”替换为“--”。 (2认同)

Mic*_*Kay 28

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


Ric*_*ers 23

--不允许与SGML兼容.从On SGML和HTML:

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

因此,在SGML <!>开闭"标记声明",并--打开和关闭评论.