XML注释中可以包含"--"吗 XML注释规范

XML注释禁止出现连续“--”,因其会干扰结束标记-->的识别;合法注释需满足正则[^-]*(-[^-])*,可用全角字符或拆分方式安全表达破折号。

XML注释中不能包含连续的“--”(两个连字符),这是XML规范明确禁止的。

XML注释的基本语法

XML注释以结束。例如:

注释内容可以包含字母、数字、空格、标点(除特定限制外),但有两个关键约束:

  • 注释内不能出现“--”子串(即两个连续的连字符)
  • 注释不能以-结尾(即不能以-->之前的那个-单独存在,实际意味着倒数第二个字符不能是-

为什么禁止“--”?

因为--是注释结束标记-->的前缀。如果注释体内出现--,解析器可能提前误判注释结束位置,导致解析失败或行为未定义。XML 1.0规范(W3C)明确规定:注释内容必须匹配正则表达式[^-]*(-[^-])*,即不允许两个连续的-

例如以下写法是非法的

❌(含--

如何安全地表达连字符或破折号?

如果确实需要在注释中表示“—”(中文破折号)、“–”(en dash)或“-”(短横线),可采用以下方式:

  • 用全角字符替代:如(U+FF0D)或(U+2014),它们不属于XML禁止的--
  • 拆开书写并加说明:如
  • 使用CDATA块不适用——注释本身不支持嵌套CDATA,CDATA只用于字符数据,不是注释的替代方案

验证与调试建议

大多数XML解析器(如libxml2、Java DOM、Python xml.etree)在遇到含--的注释时会直接报错,例如:

FATAL ERROR: Comment contains '--'

建议在编辑XML时:

  • 启用XML语法高亮/校验的编辑器(如VS Code + XML Tools、Oxygen XML)
  • 提交前用xmllint --noout file.xml命令行验证
  • 避免从富文本(如Word、网页)直接复制带自动连字符的文本到注释中