2013-03-16 159 views
3

CDATA在XML中使用,如:爲什麼XML中的CDATA語法看起來很奇怪?

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

這是一個相當不尋常的語法。當我第一次看到它時,我認爲它是我尚未學習的一些通用XML構造的特定形式。但是,據我所知(XML CDATA spec)它不是。

我的問題:是否有理由說CDATA部分看起來像它一樣,例如我是一些SGML的特例嗎?或者有些語言設計者有一天會想:「我會在CDATA之前用CDATA做一個CDATA部分,之後是一個括號,一個感嘆號,並用尖括號包圍起來。」

+2

可能是由於XML是一個SGML語言,它是一個SGML構建。 – Oded 2013-03-16 18:04:29

+0

回答實際問題:它是一個轉義序列,用於以通用格式對未編碼文本進行區分。因此,最好選擇在普通用法中永遠不會出現的序列。 – harpo 2014-09-16 20:15:55

回答

8

CDATA部分是一個標記部分。在SGML中,既有抽象語法也有具體語法。標記部分聲明的抽象語法開始於標記聲明打開(mdo)定界符,後面跟着聲明子集打開(dso)定界符。 A 狀態關鍵字緊接着是第二個聲明子集打開(dso)定界符。標記部分以標記部分結束(msc)分隔符後跟標記聲明關閉(mdc)定界符。因此,一個被標記的區域聲明的抽象語法是:

mdo dso status-keyword dso my-data msc mdc 

具體語法對於每個文檔定義。此語法在與每個文檔關聯的SGML聲明中指定。具體語法定義了要用於文檔的分隔符。默認SGML分隔符,我以爲是定義在ISO 8879:1986,如下:

  • 標記聲明開放:<!
  • 宣言子開:關閉[
  • 標記的區域:]]
  • 標記聲明關閉:>

但是你可以自由定義你自己的具體語法,因此可以修改所使用的字符作爲分隔符。

因此,一個顯着的部分聲明的默認具體的語法是:

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

可能狀態的關鍵字是:CDATA,RCDATA,不理,包括TEMP

這給我們帶來:

<![ CDATA [my-data]]> 

請參閱本書的以下章節SGML和HTML說明由馬丁·布萊恩:

相關問題