標籤:
DTD(文件類型定義)的作用是定義 XML 文檔的合法構建模組。
DTD 可被成行地聲明於 XML 文檔中,也可作為一個外部參考。
DTD簡介
內部的 DOCTYPE 聲明
假如 DTD 被包含在您的 XML 摘要檔案中,它應當通過下面的文法封裝在一個 DOCTYPE 聲明中:
<?xml version="1.0"?><!DOCTYPE note [<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>]><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don‘t forget me this weekend</body></note>
!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。
!ELstrongENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
!ELstrongENT to (第四行)定義 to 元素為 "#PCDATA" 類型
!ELstrongENT from (第五行)定義 frome 元素為 "#PCDATA" 類型
!ELstrongENT heading (第六行)定義 heading 元素為 "#PCDATA" 類型
!ELstrongENT body (第七行)定義 body 元素為 "#PCDATA" 類型
外部文檔聲明
假如 DTD 位於 XML 摘要檔案的外部,那麼它應通過下面的文法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE root-element SYSTEM "filename">
以下是 XML 文檔,這個XML文檔和上面的 XML 文檔相同,但是擁有一個外部的 DTD:
<?xml version="1.0"?><!DOCTYPE note SYSTEM "note.dtd"><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don‘t forget me this weekend!</body></note>
這是包含 DTD 的 "note.dtd" 檔案:
<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>
為什麼使用 DTD?
通過 DTD,您的每一個 XML 檔案均可攜帶一個有關其自身格式的描述。
通過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換資料。
而您的應用程式也可使用某個標準的 DTD 來驗證從外部接收到的資料。
您還可以使用 DTD 來驗證您自身的資料。
DTD - XML 構建模組
XML 文檔構建模組
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構建模組構成:
Elements :元素
Attributes :屬性
Entities :實體
PCDATA :
意思是被解析的字元資料(parsed character data)。
可把字元資料想象為 XML 元素的開始標籤與結束標籤之間的文本。
PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
文本中的標籤會被當作標記來處理,而實體會被展開。
不過,被解析的字元資料不應當包含任何 &、< 或者 > 字元;需要使用 &、< 以及 > 實體來分別替換它們。
CDATA :
意思是字元資料(character data)。
CDATA 是不會被解析器解析的文本。在這些文本中的標籤不會被當作標記來對待,其中的實體也不會被展開。
DTD - 元素
在一個 DTD 中,元素通過元素宣告來進行聲明。
聲明一個元素
在 DTD 中,XML 元素通過元素宣告來進行聲明。元素宣告使用下面的文法:
<!ELEMENT element-name category>或<!ELEMENT element-name (element-content)>
空元素
空元素通過類別關鍵詞EMPTY進行聲明:
<!ELEMENT element-name EMPTY>執行個體:<!ELEMENT br EMPTY>XML example:<br />
只有 PCDATA 的元素
只有 PCDATA 的元素通過圓括弧中的 #PCDATA 進行聲明:
<!ELEMENT element-name (#PCDATA)>執行個體:<!ELEMENT from (#PCDATA)>
帶有任何內容的元素
通過類別關鍵詞 ANY 聲明的元素,可包含任何可解析資料的組合:
<!ELEMENT element-name ANY>執行個體:<!ELEMENT note ANY>
帶有子項目(序列)的元素
帶有一個或多個子項目的元素通過圓括弧中的子項目名進行聲明:
<!ELEMENT element-name (child1)>或<!ELEMENT element-name (child1,child2,...)>執行個體:<!ELEMENT note (to,from,heading,body)>
當子項目按照由逗號分隔開的序列進行聲明時,這些子項目必須按照相同的順序出現在文檔中。在一個完整的聲明中,子項目也必須被聲明,同時子項目也可擁有子項目。"note" 元素的完整聲明是:
<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>
聲明只出現一次的元素
<!ELEMENT element-name (child-name)>執行個體:<!ELEMENT note (message)>
上面的例子聲明了:message 子項目必須出現一次,並且必須只在 "note" 元素中出現一次。
聲明最少出現一次的元素
<!ELEMENT element-name (child-name+)>執行個體:<!ELEMENT note (message+)>
上面的例子中的加號(+)聲明了:message 子項目必須在 "note" 元素內出現至少一次。
聲明出現零次或多次的元素
<!ELEMENT element-name (child-name*)>執行個體:<!ELEMENT note (message*)>
上面的例子中的星號(*)聲明了:子項目 message 可在 "note" 元素內出現零次或多次。
聲明出現零次或一次的元素
<!ELEMENT element-name (child-name?)>執行個體:<!ELEMENT note (message?)>
上面的例子中的問號(?)聲明了:子項目 message 可在 "note" 元素內出現零次或一次。
聲明"非.../既..."類型的內容
執行個體:<!ELEMENT note (to,from,header,(message|body))>
上面的例子聲明了:"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
聲明混合型的內容
執行個體:<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子聲明了:"note" 元素可包含出現零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
DTD - 屬性
DTD - 實體
DTD -- XML驗證