XML注释和“-”


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

XML似乎在内部注释中不喜欢'-'。我在某处读到“-”会切换<! ... >事物内部的某些模式,但是<!-- -- -- -->(偶数--)也似乎是无效的。如果它具有某些历史特征,那么“亲”部分是什么?(“相反”部分无法--在评论中使用)。

为什么不仅仅在注释的末尾加'->'并在其中允许'-'而使注释处理变得复杂的原因是什么?

Answers:


54

从标准文件中:

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

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


因此,“ pro”是与SGML的兼容性。
六。

2
我称其为工程折衷。
2012年

9
应该更改IMO,因为我们现在有css参数,该参数以双连字符开头,可以位于SVG元素的style属性内。注释掉这些元素将破坏与XML标准的兼容性,这仅仅是因为某些不再存在的旧格式。
Waruyama

1
是否可以更改!不幸的是,正如XML 1.1的痛苦经历所表明的那样,更改规范是一回事。让人们更新20年前编写的解析器是另一回事。而且,充满了实现不同版本标准的解析器的世界不会对任何人有所帮助。
迈克尔·凯

46

也许对某人会有帮助。我有一个问题,我想注释掉以-:开头的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注释),我认为总比没有好。


24
您还可以使用转义序列&#45;,它是ASCII转义版本,比unicode版本短一点。
drwatsoncode 2014年

嘿嘿,每个人都在抱怨,您提出了一个优雅而又显而易见的解决方案。太棒了
克里斯·博德曼

32

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


27

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

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

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


0

这个问题迟早会影响到任何喜欢使用XML注释来禁用不需要的内容的人。我有数天的主要问题,因为Spring上下文配置无法加载,而没有任何详细说明原因。问题是对这样的内容块进行注释的习惯:

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

注释掉它必须更改为:

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

注释掉的块中的破折号(而不是被忽略)使整个文件的解析变得混乱,无论它们位于何处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.