2011-08-17 173 views

回答

104

解析器将解析XML文档中的所有文本。

但是,CDATA部分内的文本将被解析器忽略。

CDATA - (非解析)字符数据

术语CDATA使用约不应由XML解析器解析的文本数据。

像“<”和“&”这样的字符在XML元素中是非法的。

“<”将产生错误,因为解析器将其解释为新元素的开始。

“&”将产生错误,因为解析器将其解释为字符实体的开始。

某些文本(如JavaScript代码)包含大量“<”或“&”字符。为了避免错误,脚本代码可以定义为CDATA。

解析器忽略CDATA部分内的所有内容。

CDATA项与 “<![CDATA[” 开始,以 “]]>

程序输出使用CDATA的XHTML文档

CDATA部分容易被不同的解析结束因为HTML解析器不能识别CDATA开始和结束标记,也不能识别HTML实体引用,例如<script>标记中的&lt;。这可能会导致Web浏览器出现渲染问题,并且如果用于显示来自不受信任源的数据,则可能会导致跨站点脚本漏洞,因为两种解析器将不同意CDATA部分结束的位置。

A brief SGML tutorial

另请参阅Wikipedia entry on CDATA

73

CDATA在HTML中完全没有意义。

CDATA是一个XML构造,它将标记的内容设置为通常是#PCDATA分析的字符数据,而不是将其视为#CDATA,即非分析字符数据。它仅在XHTML中相关且有效。

它用于script标签以避免解析<&。在HTML中,这不是必需的,因为在HTML中,script已经是#CDATA。

+9

因此,Y不人使用它Javascript中标签?在哪里有什么意义,谢谢 – SexyMF 2011-08-17 11:45:44

+0

@SexyMF可能是因为这些人输入了XHTML文档而不是SGML/HTML,并且/或者他们希望帮助符合标准的浏览器更少地正确加载他们的页面。 – amn 2017-04-25 13:39:33

+0

尽管已经快6岁了,但这仍然是我见过的CDATA的最佳解释。 – freginold 2017-05-11 17:55:38

4

CDATA是来自文档字符集的一系列字符,可能包含字符实体。用户代理应该如下解释的属性值: ,字符替换字符实体,

忽略换行符,

替换为单个空格每个回车或标签。

15

http://en.wikipedia.org/wiki/CDATA

既然是能够使用低于迹象(<)和 符号(&)在网页脚本中非常有用,并在较小程度上的风格, 无需要记住要逃避它们,通常在内联文本和 XHTML文档中使用CDATA 标记。但是,这样的文件也可以通过HTML解析 分析器,它不承认CDATA标记,在CDATA标记 通常被注释掉,因为在这个JavaScript示例:

<script type="text/javascript"> 
//<![CDATA[ 
document.write("<"); 
//]]> 
</script> 
5

使用它的方式来编写HTML和XHTML的公共子集,更便携的希望。

在HTML中,<script>是魔法逃脱一切,直到出现</script>

所以你可以这样写:

<script>x = '<br/>'; 

<br/>不会被视为一个标签。

这就是为什么字符串,例如:

x = '</scripts>' 

必须进行转义,如:

x = '</scr' + 'pts>' 

参见:Why split the <script> tag when writing it with document.write()?

但XML(因此XHTML,这是一个 “子集”的XML,unlike HTML),并没有那么神奇:<br/>会被视为一个标签。

<![CDATA[是XHTML的方式来表达:

不分析任何标记,直到下一个]]>,认为这是所有的字符串

//的加入使CDATA工作做好在HTML中也是如此。

在HTML <![CDATA[不是魔术,所以它会由JavaScript运行。所以//用于注释掉。

的XHTML也看到//,但会观察它作为一个空注释行这不是一个问题:

// 

也就是说:如果该文件是

  • 兼容的浏览器应该承认来自最初的文档类型的XHTML的HTML <!DOCTYPE html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  • 兼容的网站可以依赖于兼容的浏览器,并协调一个有效的文档类型script语法

但违反了互联网的黄金法则:

不信任的第三方,或你的产品将打破