2011-08-17 177 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語法

但違反了互聯網的黃金法則:

不信任的第三方,或你的產品將打破