WIKI使用導(dǎo)航
站長百科導(dǎo)航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計算
- 微博營銷
- 虛擬主機管理系統(tǒng)
- 開放平臺
- WIKI程序與應(yīng)用
- 美國十大主機
DTD

DTD(Document Type Definition) 是一套關(guān)于標(biāo)記符的語法規(guī)則。它是XML1.0版規(guī)格的一部分,是XML文件的驗證機制,屬于XML文件的組成部分。DTD 是一種保證XML文檔格式正確的有效方法,可通過比較XML文檔和DTD文件來看文檔是否符合規(guī)范,元素和標(biāo)簽使用是否正確。XML文件提供應(yīng)用程序一個數(shù)據(jù)交換的格式,DTD正是讓XML文件能成為數(shù)據(jù)交換標(biāo)準(zhǔn),因為不同的公司只需定義好標(biāo)準(zhǔn)DTD,各公司都能依DTD建立XML文件,并且進(jìn)行驗證,如此就可以輕易的建立標(biāo)準(zhǔn)和交換數(shù)據(jù),這樣滿足了網(wǎng)絡(luò)共享和數(shù)據(jù)交互。DTD文件是一個ASCII文本文件,后綴名為.dtd。
文檔類型定義(DTD)可定義合法的XML文檔構(gòu)建模塊。它使用一系列合法的元素來定義文檔的結(jié)構(gòu)。DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
DTD元素[ ]
在一個 DTD 中,元素通過元素聲明來進(jìn)行聲明。
- 聲明一個元素
在 DTD 中,XML 元素通過元素聲明來進(jìn)行聲明。元素聲明使用下面的語法:
<!ELEMENT 元素名稱 類別> 或者 <!ELEMENT 元素名稱 (元素內(nèi)容)>
- 空元素
空元素通過類別關(guān)鍵詞EMPTY進(jìn)行聲明:
<!ELEMENT 元素名稱 EMPTY>
- 只有 PCDATA 的元素
只有 PCDATA 的元素通過圓括號中的 #PCDATA 進(jìn)行聲明:
<!ELEMENT 元素名稱 (#PCDATA)>
- 帶有任何內(nèi)容的元素
通過類別關(guān)鍵詞 ANY 聲明的元素,可包含任何可解析數(shù)據(jù)的組合:
<!ELEMENT 元素名稱 ANY>
- 帶有子元素(序列)的元素
帶有一個或多個子元素的元素通過圓括號中的子元素名進(jìn)行聲明:
<!ELEMENT 元素名稱 (子元素名稱 1)> 或者 <!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>
- 相同的元素至少出現(xiàn)一次的聲明
語法格式為:
<!ELEMENT element-name (child-name+)> 例: <!ELEMENT note (message+)> 例中的+是指子元素message必須在被包含的note元素里出現(xiàn)一次或者多次。
- 相同的元素不出現(xiàn)或者多次出現(xiàn)的聲明
語法格式為:
<!ELEMENT element-name (child-name*)> 例: <!ELEMENT note (message*)> 例中的*是指子元素message能夠在被包含的note元素里不出現(xiàn)或者出現(xiàn)多次。
DTD屬性[ ]
在 DTD 中,屬性通過 ATTLIST 聲明來進(jìn)行聲明。
- 聲明屬性
屬性聲明擁使用下列語法:
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認(rèn)值>
下面是屬性類型的概述:
- 類型描述
CDATA 值為字符數(shù)據(jù) (character data) (en1|en2|..) 此值是枚舉列表中的一個值 ID 值為唯一的 id IDREF 值為另外一個元素的 id IDREFS 值為其他 id 的列表 NMTOKEN 值為合法的 XML 名稱 NMTOKENS 值為合法的 XML 名稱的列表 ENTITY 值是一個實體 ENTITIES 值是一個實體列表 NOTATION 此值是符號的名稱 xml: 值是一個預(yù)定義的 XML 值
默認(rèn)值參數(shù)可使用下列值:
- 值解釋
值屬性的默認(rèn)值 #REQUIRED 屬性值是必需的 #IMPLIED 屬性不是必需的 #FIXED value 屬性值是固定的
- 規(guī)定一個默認(rèn)的屬性值
DTD: <!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0"> 合法的 XML: <square width="100" />
補充說明:上面的例子中,"square" 被定義為帶有 CDATA 類型的 "width" 屬性的空元素。如果寬度沒有被設(shè)定,其默認(rèn)值為0 。
DTD實體(ENTITIES)[ ]
- 實體是用于定義引用普通文本或特殊字符的快捷方式的變量。
- 實體引用是對實體的引用。
- 實體可在內(nèi)部或外部進(jìn)行聲明。
- 一個內(nèi)部實體聲明
語法:<!ENTITY 實體名稱 "實體的值">
DTD 例子:<!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright 具體的url">XML 例子: <author>&writer;©right;</author>注釋: 一個實體由三部分構(gòu)成: 一個和號 (&), 一個實體名稱, 以及一個分號 (;)。
- 一個外部實體聲明
語法:<!ENTITY 實體名稱 SYSTEM "URI/URL">
DTD 例子: <!ENTITY writer SYSTEM "具體的url"> <!ENTITY copyright SYSTEM "具體的url">XML 例子: <author>&writer;©right;</author>

DTD實例[ ]
- 報紙文章 DTD
<!DOCTYPE NEWSPAPER [ <!ELEMENT NEWSPAPER (ARTICLE+)> <!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)> <!ELEMENT HEADLINE (#PCDATA)> <!ELEMENT BYLINE (#PCDATA)> <!ELEMENT LEAD (#PCDATA)> <!ELEMENT BODY (#PCDATA)> <!ELEMENT NOTES (#PCDATA)> <!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED> <!ATTLIST ARTICLE EDITOR CDATA #IMPLIED> <!ATTLIST ARTICLE DATE CDATA #IMPLIED> <!ATTLIST ARTICLE EDITION CDATA #IMPLIED> <!ENTITY NEWSPAPER "Vervet Logic Times"> <!ENTITY PUBLISHER "Vervet Logic Press"> <!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press"> ]>
- 產(chǎn)品目錄 DTD
<!DOCTYPE CATALOG [ <!ENTITY AUTHOR "John Doe"> <!ENTITY COMPANY "JD Power Tools, Inc."> <!ELEMENT CATALOG (PRODUCT+)> <!ELEMENT PRODUCT (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)> <!ATTLIST PRODUCT NAME CDATA #IMPLIED CATEGORY (HandTool|Table|Shop-Professional) "HandTool" PARTNUM CDATA #IMPLIED PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago" INVENTORY (InStock|Backordered|Discontinued) "InStock"> <!ELEMENT SPECIFICATIONS (#PCDATA)> <!ATTLIST SPECIFICATIONS WEIGHT CDATA #IMPLIED POWER CDATA #IMPLIED> <!ELEMENT OPTIONS (#PCDATA)> <!ATTLIST OPTIONS FINISH (Metal|Polished|Matte) "Matte" ADAPTER (Included|Optional|NotApplicable) "Included" CASE (HardShell|Soft|NotApplicable) "HardShell"> <!ELEMENT PRICE (#PCDATA)> <!ATTLIST PRICE MSRP CDATA #IMPLIED WHOLESALE CDATA #IMPLIED STREET CDATA #IMPLIED SHIPPING CDATA #IMPLIED> <!ELEMENT NOTES (#PCDATA)> ]>
DTD內(nèi)部的DOCTYPE聲明[ ]
假如 DTD 被包含在您的 XML 源文件中,它應(yīng)當(dāng)通過下面的語法包裝在一個 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外部文檔聲明[ ]
假如 DTD 位于 XML 源文件的外部,那么它應(yīng)通過下面的語法被封裝在一個 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 文件均可攜帶一個有關(guān)其自身格式的描述。
- 通過 DTD,獨立的團(tuán)體可一致地使用某個標(biāo)準(zhǔn)的 DTD 來交換數(shù)據(jù)。
- 應(yīng)用程序也可使用某個標(biāo)準(zhǔn)的 DTD 來驗證從外部接收到的數(shù)據(jù)。
- 還可以使用 DTD 來驗證自身的數(shù)據(jù)。
DTD的優(yōu)缺點[ ]
- DTD的優(yōu)勢
- 每一個XML文檔都可攜帶一個DTD,用來對該文檔格式進(jìn)行描述,測試該文檔是否為有效的XML文檔。既然DTD有外部和內(nèi)部之分,當(dāng)然就可以為某個獨立的團(tuán)體定義一個公用的外部DTD,那么多個XML文檔就都可以共享使用該DTD,使得數(shù)據(jù)交換更為有效。甚至在某些文檔中還可以使內(nèi)部DTD和外部DTD相結(jié)合。在應(yīng)用程序中也可以用某個DTD來檢測接收到的數(shù)據(jù)是否符合某個標(biāo)準(zhǔn)。
- 對于XML文檔而言,雖然DTD不是必須的,但它為文檔的編制帶來了方便。加強了文檔標(biāo)記內(nèi)參數(shù)的一致性,使XML語法分析器能夠確認(rèn)文檔。如果不使用DTD來對XML文檔進(jìn)行定義,那么XML語法分析器將無法對該文檔進(jìn)行確認(rèn)。
- 每個XML文檔都只有一個根元素,其它的子元素都包含在該根元素中。因此在DTD中對根元素的聲明是必不可少的。根元素聲明的一般形式如下:
<!DOCTYPE root[ <!-- 子元素 --> ]> <!-- 文件體 -->
- DOCTYPE是“document type”(文檔類型)的簡寫,DOCTYPE聲明必須放在文檔最頂部,在所有代碼和標(biāo)識之上,DOCTYPE聲明是必不可少的關(guān)鍵組成部分。DTD語法要求DOCTYPE必須要大寫,而且DOCTYPE和元素之間必須要有空格隔開。如在以上代碼中DOCTYPE和根元素root之間要有空格隔開。
- DTD的缺陷
利用DTD驗證有效性的解析器,就能夠立即對文檔的完整性進(jìn)行可靠的檢查。DTD雖然比較實用,但DTD自身也有很多的不足之處。
- DTD有自己的特殊語法,其本身不是XML文檔;
- DTD只提供了有限的數(shù)據(jù)類型,用戶無法自定義類型;
- DTD不支持域名機制。