4

CDATA 在 XML 中使用,例如:

<my-tag><![CDATA[my-data]]></my-tag>

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

我的问题:CDATA 部分看起来像这样是否有原因,例如,是某些 SGML 事物的特例吗?或者某个语言设计者是否有一天只是想“我将创建一个 CDATA 部分,在 CDATA 之前有一个括号,之后是一个括号,一个感叹号,用尖括号括起来。”

4

1 回答 1

9

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

mdo dso status-keyword dso my-data msc mdc

为每个文档定义了具体的语法。此语法在与每个文档相关的 SGML 声明中指定。具体语法定义要用于文档的分隔符。我假设在 ISO 8879:1986 中定义的默认 SGML 分隔符如下:

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

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

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

<![ status-keyword [my-data]]>

可能的状态关键字有:CDATA、RCDATA、IGNORE、INCLUDE、TEMP

这使我们:

<![ CDATA [my-data]]>

请参阅Martin Bryan的《 SGML 和 HTML 解释》一书中的以下章节:

于 2013-03-16T21:47:53.217 回答