CDATA在XML中使用如下:
<my-tag><![CDATA[my-data]]></my-tag>
这是一种非常不寻常的语法。当我第一次看到它时,我认为它是我尚未学习的一些通用XML构造的特定形式。但是,据我所知(XML CDATA spec),它不是。
我的问题:CDATA部分看起来是否有原因,例如:我是一个SGML的特例吗?或者有些语言设计师只是想到有一天“我会在CDATA之前用支架制作一个CDATA部分,之后是一个括号,一个感叹号,用尖括号包围。”
答案 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 中的以下章节: