文章目錄
- 相同的元素至少出現一次的聲明
- 相同的元素不出現或者多次出現的聲明
(Document Type Definition)
DTD 是一套關於標記符的文法規則。它是XML1.0版規格得一部分,是XML檔案的驗證機制,屬於XML檔案組成的一部分。
DTD 是一種保證XML文檔格式正確的有效方法,可以通過比較XML文檔和DTD檔案來看文檔是否符合規範,元素和標籤使用是否正確。一個DTD文檔包含:元素的定義規則,元素間關係的定義規則,元素可使用的屬性,可使用的實體或符號規則。
XML檔案提供應用程式一個資料交換的格式,DTD正是讓XML檔案能夠成為資料交換的標準,因為不同的公司只需定義好標準的DTD,各公司都能夠依照DTD建立XML檔案,並且進行驗證,如此就可以輕易的建立標準和交換資料,這樣滿足了網際網路共用和資料互動。
DTD檔案是一個ASCII的文字檔,尾碼名為.dtd。
1、DTD 簡介
文件類型定義(DTD)可定義合法的XML文檔構建模組。它使用一系列合法的元素來定義文檔的結構。
DTD 可被成行地聲明於 XML 文檔中,也可作為一個外部參考。
內部的 DOCTYPE 聲明
假如 DTD 被包含在您的 XML 摘要檔案中,它應當通過下面的文法封裝在一個 DOCTYPE 聲明中:
*****************************************************************************
<!DOCTYPE 根項目 [元素宣告]>
*****************************************************************************
帶有 DTD 的 XML 文檔執行個體
*****************************************************************************
<?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>
*****************************************************************************
以上 DTD 解釋如下:
!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。
!ELEMENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
!ELEMENT to (第四行)定義 to 元素為 "#PCDATA" 類型
!ELEMENT from (第五行)定義 from 元素為 "#PCDATA" 類型
!ELEMENT heading (第六行)定義 heading 元素為 "#PCDATA" 類型
!ELEMENT body (第七行)定義 body 元素為 "#PCDATA" 類型
外部文檔聲明
假如 DTD 位於 XML 摘要檔案的外部,那麼它應通過下面的文法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE 根項目 SYSTEM "檔案名稱">
這個 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 來驗證您自身的資料。2、DTD - XML 構建模組
XML 以及 HTML 文檔的主要構建模組是類似 <body>....</body> 這樣的標籤。
XML 文檔構建模組
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構建模組構成:
元素
屬性
實體
PCDATA
CDATA
下面是每個構建模組的簡要描述。
元素
元素是 XML 以及 HTML 文檔的主要構建模組。
HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
執行個體:
*********************************************************
<body>body text in between</body>
<message>some message in between</message>
*********************************************************
屬性
屬性可提供有關元素的額外資訊。
屬性總是被置於某元素的開始標籤中。屬性總是以名稱/值的形式成對出現的。下面的 "img" 元素擁有關於源檔案的額外資訊:
*********************************************************
<img src="computer.gif" />
*********************************************************
元素的名稱是 "img"。屬性的名稱是 "src"。屬性的值是 "computer.gif"並且可以用樣式來控制大小等顯示效果。由於元素本身為空白,它被一個 " /" 關閉。
實體
實體是用來定義普通文本的變數。實體引用是對實體的引用。
大多數同學都瞭解這個 HTML 實體引用:" "。這個“無折行空格”實體在 HTML 中被用於在某個文檔中插入一個額外的空格。
當文檔被 XML 解析器解析時,實體就會被展開。
PCDATA
PCDATA 的意思是被解析的字元資料(parsed character data)。
可把字元資料想象為 XML 元素的開始標籤與結束標籤之間的文本。
PDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
文本中的標籤會被當作標記來處理,而實體會被展開。
不過,被解析的字元資料不應當包含任何 &、< 或者 > 字元;需要使用 &、< 以及 > 實體來分別替換它們。
CDATA
CDATA 的意思是字元資料(character data)。
CDATA 是不會被解析器解析的文本。在這些文本中的標籤不會被當作標記來對待,其中的實體也不會被展開。3、DTD - 元素
在一個 DTD 中,元素通過元素宣告來進行聲明。
聲明一個元素
在 DTD 中,XML 元素通過元素宣告來進行聲明。元素宣告使用下面的文法:
<!ELEMENT 元素名稱 類別>
或者
<!ELEMENT 元素名稱 (元素內容)>
空元素
空元素通過類別關鍵詞EMPTY進行聲明:
<!ELEMENT 元素名稱 EMPTY>
只有 PCDATA 的元素
只有 PCDATA 的元素通過圓括弧中的 #PCDATA 進行聲明:
<!ELEMENT 元素名稱 (#PCDATA)>
帶有任何內容的元素
通過類別關鍵詞 ANY 聲明的元素,可包含任何可解析資料的組合:
<!ELEMENT 元素名稱 ANY>
帶有子項目(序列)的元素
帶有一個或多個子項目的元素通過圓括弧中的子項目名進行聲明:
<!ELEMENT 元素名稱 (子項目名稱 1)>
或者
<!ELEMENT 元素名稱 (子項目名稱 1,子項目名稱 2,.....)>
相同的元素至少出現一次的聲明
文法格式為:
<!ELEMENT element-name (child-name+)>
例:
<!ELEMENT note (message+)>
例中的+是指子項目message必須在被包含的note元素裡出現一次或者多次。
相同的元素不出現或者多次出現的聲明
文法格式為:
<!ELEMENT element-name (child-name*)>
例:
<!ELEMENT note (message*)> 例中的*是指子項目message能夠在被包含的note元素裡不出現或者出現多次。4、DTD - 屬性
在 DTD 中,屬性通過 ATTLIST 聲明來進行聲明。
聲明屬性
屬性聲明擁使用下列文法:
<!ATTLIST 元素名稱 屬性名稱 屬性類型 預設值>
以下是屬性類型的選項:
類型 描述
CDATA 值為字元資料 (character data)
(en1|en2|..) 此值是枚舉列表中的一個值
ID 值為唯一的 id
IDREF 度量為另外一個元素的 id
IDREFS 值為其他 id 的列表
NMTOKEN 值為合法的 XML 名稱
NMTOKENS 值為合法的 XML 名稱的列表
ENTITY 值是一個實體
ENTITIES 值是一個實體列表
NOTATION 此值是符號的名稱
xml: 值是一個預定義的 XML 值
預設值參數可使用下列值:
值 解釋
值 屬性的預設值
#REQUIRED 屬性值是必需的
#IMPLIED 屬性不是必需的
#FIXED value 屬性值是固定的
規定一個預設的屬性值
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的 XML:
<square width="100" />
在上面的例子中,"square" 被定義為帶有 CDATA 類型的 "width" 屬性的空元素。如果寬度沒有被設定,其預設值為0 。DTD的優勢和缺陷
DTD的優勢
每一個XML文檔都可攜帶一個DTD,用來對該文檔格式進行描述,測試該文檔是否為有效XML文檔。既然DTD有外部和內部之分,當然就可以為某個獨立的團體定義一個公用的外部DTD,那麼多個XML文檔就都可以共用使用該DTD,使得資料交換更為有效。甚至在某些文檔中還可以使內部DTD和外部DTD相結合。在應用程式中也可以用某個DTD來檢測接收到的資料是否符合某個標準。
對於XML文檔而言,雖然DTD不是必須的,但它為文檔的編製帶來了方便。加強了文檔標記內參數的一致性,使XML文法分析器能夠確認文檔。如果不使用DTD來對XML文檔進行定義,那麼XML文法分析器將無法對該文檔進行確認。
元素的定義
根項目的聲明
每個XML文檔都只有一個根項目,其它的子項目都包含在該根項目中。因此在DTD中對根項目的聲明是必不可少的。根項目聲明的一般形式如下:
<!DOCTYPE root[
<!-- 子項目 --> ]>
<!-- 檔案體 -->
DOCTYPE是“document type”(文件類型)的簡寫,DOCTYPE聲明必須放在文檔最頂部,在所有代碼和標識之上,DOCTYPE聲明是必不可少的關鍵組成部分。DTD文法要求DOCTYPE必須要大寫,而且DOCTYPE和元素之間必須要有空格隔開。如在以上代碼中DOCTYPE和根項目root之間要有空格隔開。
DTD的缺陷
利用DTD驗證有效性的解析器,就能夠立即對文檔的完整性進行可靠的檢查。DTD雖然比較實用,但DTD也有不少的缺陷。