是否有任何特殊原因(除了会使解析更难)XML 不允许嵌套注释,例如
<!--
<!-- this is the foo element -->
<foo>bar</foo>
-->
?
是否有任何特殊原因(除了会使解析更难)XML 不允许嵌套注释,例如
<!--
<!-- this is the foo element -->
<foo>bar</foo>
-->
?
在不更改语法的情况下,完全可以允许嵌套注释。XML 的设计者选择不这样做是因为他们非常关心 SGML 的兼容性:它会允许不是有效 SGML 文档的 XML 文档。
因为<! >
是标记声明--
的语法,也是注释开始和结束的语法。
您不能嵌套注释,因为开始注释的语法与结束注释的语法相同。
据推测,您不能嵌套标签的原因相同:
<tag1 <tag2>foo</tag2>> <!-- 这行不通。-->
评论实际上只是一种标签,同样的规则适用于评论和任何其他标签。
更新:昆汀正确地指出评论实际上不是标签。这是完全不同的事情。然而,真实的是,注释遵循与标签相同的定界符-内容-定界符模式。将注释规则 (15) 与空标签规则 (44) 和开始标签规则 (40, 41) 进行比较,并将这些规则与元素规则 (39) 进行对比。元素可以嵌套 (43),但一个元素是(回到 39)一个 start_tag-content-end_tag 组合,其中内容部分可以是一个元素。再次,评论就像一个单独的标签,而不是一个元素。
现在,所有这一切都解释了评论不能嵌套,但不是为什么要这样设计。我对 XML 的历史了解不多,无法说出其设计者的心声,但 XML 是更一般的 SGML 的“应用程序”。它也是在引入 HTML 之后很好地开发出来的,部分目的是为了解决 HTML 中的一些缺陷。SGML 和 HTML共享相同的注释语法,只要查看 XML 继承了相同的语法就很明显了。那么,人们不得不想象,XML 注释之所以能够以它们的方式工作,很大程度上是因为它们是从其前辈那里继承而来的:甚至在 XML 开发开始之前就已经做出了决定。
开始注释标记注释掉它看到的所有内容(包括更多开始注释标记),直到它到达第一个结束注释标记。之后,评论结束,任何剩余的关闭评论标签将不会被识别。与 HTML 相同。