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

为什么XML中的CDATA语法看起来如此奇怪?,xml,cdata,Xml,Cdata,CDATA在XML中使用,如: <my-tag><![CDATA[my-data]]></my-tag> 这是一种很不寻常的语法。当我第一次看到它时,我认为它是我还没有学习过的一些通用XML构造的一种特定形式。但是,据我所知()它不是 我的问题:CDATA部分看起来像这样有什么原因吗?例如,我是SGML的特例吗?或者某个语言设计师只是想有一天“我将制作一个CDATA部分,在CDATA之前加一个括号,之后加一个括号,一个感叹号,用尖括号括起来。”CDATA

CDATA在XML中使用,如:

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

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


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

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

mdo dso status-keyword dso my-data msc mdc
<![ status-keyword [my-data]]>
为每个文档定义了具体的语法。此语法在与每个文档关联的SGML声明中指定。具体语法定义了用于文档的分隔符。默认SGML分隔符(我假设在ISO 8879:1986中定义)如下所示:

  • 标记声明打开:
  • 声明子集打开:
    [
  • 已标记部分关闭:
    ]
  • 标记声明关闭:
但您可以自由定义自己的具体语法,因此可以修改用作分隔符的字符

因此,标记节声明的默认具体语法为:

mdo dso status-keyword dso my-data msc mdc
<![ status-keyword [my-data]]>

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

这让我们想到:

<![ CDATA [my-data]]>

参见Martin Bryan解释的SGML和HTML一书中的以下章节:


可能是因为XML是一种SGML语言,它是一种SGML结构。回答实际问题:它是一个转义序列,用于以通用格式标记未编码的文本;因此,最好选择在正常使用中永远不会出现的序列。