为什么XML中的CDATA语法看起来如此奇怪?

Adr*_*ith 3 xml cdata

CDATA在XML中使用如下:

<my-tag><![CDATA[my-data]]></my-tag>
Run Code Online (Sandbox Code Playgroud)

这是一种非常不寻常的语法.当我第一次看到它时,我认为它是我尚未学习的一些通用XML构造的特定形式.但是,据我所知(XML CDATA规范),它不是.

我的问题:有没有理由为什么CDATA部分看起来像它,例如是一些SGML的特殊情况?或者有些语言设计师只是想到有一天"我会在CDATA之前用支架制作一个CDATA部分,之后是一个支架,一个感叹号,用尖括号包围."

chr*_*ris 8

CDATA部分是标记的部分.在SGML中,既有抽象语法,也有具体语法.标记部分声明的抽象语法以标记声明open (mdo)分隔符开头,后跟声明子集open (dso)分隔符.一个状态关键字随之而来的后面是第二个声明子开(DSO)分隔符.标记的部分以标记的部分关闭(msc)分隔符结束,后跟标记声明关闭(mdc)分隔符.因此,标记的部分声明的抽象语法是:

mdo dso status-keyword dso my-data msc mdc
Run Code Online (Sandbox Code Playgroud)

具体语法对每个文档定义.此语法在与每个文档关联的SGML声明中指定.具体语法定义了用于文档的分隔符.默认的SGML分隔符,我假设在ISO 8879:1986中定义,如下所示:

  • 标记声明打开: <!
  • 声明子集打开: [
  • 标记部分关闭: ]]
  • 标记声明关闭: >

但您可以自由定义自己的具体语法,因此可以修改用作分隔符的字符.

因此,标记的部分声明的默认具体语法是:

<![ status-keyword [my-data]]>
Run Code Online (Sandbox Code Playgroud)

可能的状态关键字是:CDATA,RCDATA,IGNORE,INCLUDE,TEMP

这让我们:

<![ CDATA [my-data]]>
Run Code Online (Sandbox Code Playgroud)

请参阅Martin Bryan的SGML和HTML Explained一书中的以下章节: