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

时间:2013-03-16 18:03:02

标签: xml cdata

CDATA在XML中使用如下:

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

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

我的问题:CDATA部分看起来是否有原因,例如:我是一个SGML的特例吗?或者有些语言设计师只是想到有一天“我会在CDATA之前用支架制作一个CDATA部分,之后是一个括号,一个感叹号,用尖括号包围。”

1 个答案:

答案 0 :(得分:8)

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

mdo dso status-keyword dso my-data msc mdc

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

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

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

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

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

可能的 status-keywords 是:CDATA,RCDATA,IGNORE,INCLUDE,TEMP

这将我们带到:

<![ CDATA [my-data]]>

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