文檔類型定義

文檔類型定義

文檔類型定義(Document Type Definition)是一套為了進行程式間的數據交換而建立的關於標記符的語法規則。它是標準通用標記語言和可擴展標記語言1.0版規格的一部分,文檔可根據某種DTD語法規則驗證格式是否符合此規則。文檔類型定義也可用做保證標準通用標記語言、可擴展標記語言文檔格式的合法性,可通過比較文檔和文檔類型定義檔案來檢查文檔是否符合規範,元素和標籤使用是否正確。檔案實例提供應用程式一個數據交換的格式。使用各類文檔類型定義是為了讓標準通用標記語言、可擴展標記語言檔案能符合規定的數據交換標準,因為這樣,不同的公司只需定義好標準文檔類型定義,就都能依文檔類型定義建立文檔實例,並且進行驗證,如此就可以輕易交換數據,防止了實例數據定義不同等原因造成的數據交換障礙,滿足了網路共享和數據互動。文檔類型定義檔案是一個美國信息交換標準代碼文本檔案。

基本信息

簡介

文檔類型定義可定義合法的標準通用標記語言、可擴展標記語言文檔構建模組。它使用一系列合法的元素來定義文檔的結構。
文檔類型定義可被成行地聲明於標準通用標記語言、可擴展標記語言文檔中,也可作為一個外部引用。

聲明

文檔類型定義可定義合法的XML文檔構建模組。
它使用一系列合法的元素來定義文檔的結構。
它可被成行地聲明於XML文檔中,也可作為一個外部引用。
通過它,您的每一個XML檔案均可攜帶一個有關其自身格式的描述。
通過它,獨立的團體可一致地使用某個標準的文檔類型定義來交換數據。
而您的應用程式也可使用某個標準的文檔類型定義來驗證從外部接收到的數據。
您還可以使用它來驗證您自身的數據。
內部聲明
假如DTD被包含在您的XML源檔案中,它應當通過下面的語法包裝在一個!DOCTYPE聲明中:
<!DOCTYPE根元素[元素聲明]>
帶有DTD的XML文檔實例
<?xmlversion="1.0"?>
<!DOCTYPEnote[
<!ELEMENTnote(to,from,heading,body)>
<!ELEMENTto(#PCDATA)>
<!ELEMENTfrom(#PCDATA)>
<!ELEMENTheading(#PCDATA)>
<!ELEMENTbody(#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don'tforgetmethisweekend</body>
</note>
以上DTD解釋如下:
!DOCTYPEnote(第二行)定義此文檔是note類型的文檔。
!ELEMENTnote(第三行)定義note元素有四個元素:"to、from、heading,、body"
!ELEMENTto(第四行)定義to元素為"#PCDATA"類型
!ELEMENTfrom(第五行)定義from元素為"#PCDATA"類型
!ELEMENTheading(第六行)定義heading元素為"#PCDATA"類型
!ELEMENTbody(第七行)定義body元素為"#PCDATA"類型
外部聲明
假如DTD位於XML源檔案的外部,那么它應通過下面的語法被封裝在一個DOCTYPE定義中:
<!DOCTYPE根元素SYSTEM"檔案名稱">
這個XML文檔和上面的XML文檔相同,但是擁有一個外部的DTD:
<?xmlversion="1.0"?>
<!DOCTYPEnoteSYSTEM"note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don'tforgetmethisweekend!</body>
</note>
這是包含DTD的"note.dtd"檔案:
<!ELEMENTnote(to,from,heading,body)>
<!ELEMENTto(#PCDATA)>
<!ELEMENTfrom(#PCDATA)>
<!ELEMENTheading(#PCDATA)>
<!ELEMENTbody(#PCDATA)>

模組

DTDDTD
XML以及HTML文檔的主要構建模組是類似<body>....</body>這樣的標籤。
XML文檔構建模組
所有的XML文檔(以及HTML文檔)均由以下簡單的構建模組構成:
元素
屬性
實體
PCDATA
CDATA
下面是每個構建模組的簡要描述。
元素
元素是XML以及HTML文檔的主要構建模組。
HTML元素的例子是"body"和"table"。XML元素的例子是"note"和"message"。元素可包含文本、其他元素或者是空的。空的HTML元素的例子是"hr"、"br"以及"img"。
實例:
<body>bodytextinbetween</body>
<message>somemessageinbetween</message>
屬性
屬性可提供有關元素的額外信息。
屬性總是被置於某元素的開始標籤中。屬性總是以名稱/值的形式成對出現的。下面的"img"元素擁有關於源檔案的額外信息:
<imgsrc="computer.gif"/>
元素的名稱是"img"。屬性的名稱是"src"。屬性的值是"computer.gif"並且可以用樣式來控制大小等顯示效果。由於元素本身為空,它被一個"/"關閉。
實體
實體是用來定義普通文本的變數。實體引用是對實體的引用。
大多數同學都了解這個HTML實體引用:"&nbsp;"。這個“無折行空格”實體在HTML中被用於在某個文檔中插入一個額外的空格。
當文檔被XML解析器解析時,實體就會被展開。
PCDATA
PCDATA的意思是被解析的字元數據(parsedcharacterdata)。
可把字元數據想像為XML元素的開始標籤與結束標籤之間的文本。
PCDATA是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
文本中的標籤會被當作標記來處理,而實體會被展開。
不過,被解析的字元數據不應當包含任何&、<或者>字元;需要使用&amp;、&lt;以及&gt;實體來分別替換它們。
CDATA
CDATA的意思是字元數據(characterdata)。
CDATA是不會被解析器解析的文本。在這些文本中的標籤不會被當作標記來對待,其中的實體也不會被展開。

元素

在一個DTD中,元素通過元素聲明來進行聲明。
聲明一個元素
在DTD中,XML元素通過元素聲明來進行聲明。元素聲明使用下面的語法:
<!ELEMENT元素名稱類別>
或者
<!ELEMENT元素名稱(元素內容)>
空元素
空元素通過類別關鍵字EMPTY進行聲明:
<!ELEMENT元素名稱EMPTY>
只有PCDATA的元素
只有PCDATA的元素通過圓括弧中的#PCDATA進行聲明:
<!ELEMENT元素名稱(#PCDATA)>
帶有任何內容的元素
通過類別關鍵字ANY聲明的元素,可包含任何可解析數據的組合:
<!ELEMENT元素名稱ANY>
帶有子元素(序列)的元素
帶有一個或多個子元素的元素通過圓括弧中的子元素名進行聲明:
<!ELEMENT元素名稱(子元素名稱1)>
或者
<!ELEMENT元素名稱(子元素名稱1,子元素名稱2,.....)>

同元素次數

相同的元素至少出現一次
語法格式為:
<!ELEMENTelement-name(child-name+)>
例:
<!ELEMENTnote(message+)>
例中的+是指子元素message必須在被包含的note元素里出現一次或者多次。
同元素不出現或者多次出現
語法格式為:
<!ELEMENTelement-name(child-name*)>
例:
<!ELEMENTnote(message*)>
例中的*是指子元素message能夠在被包含的note元素里不出現或者出現多次。
同元素不出現或者出現一次
語法格式為:
<!ELEMENTelement-name(child-name?)>
例:
<!ELEMENTnote(message?)>
例中的?是指子元素message能夠在被包含的note元素里不出現或者出現一次。

屬性

在DTD中,屬性通過ATTLIST聲明來進行聲明。
聲明屬性
屬性聲明擁使用下列語法:
<!ATTLIST元素名稱屬性名稱屬性類型默認值>
以下是屬性類型的選項:
類型描述
CDATA值為字元數據(characterdata)
(en1|en2|..)此值是枚舉列表中的一個值
ID值為唯一的id
IDREF值為另外一個元素的id
IDREFS值為其他id的列表
NMTOKEN值為合法的XML名稱
NMTOKENS值為合法的XML名稱的列表
ENTITY值是一個實體
ENTITIES值是一個實體列表
NOTATION此值是符號的名稱
xml:值是一個預定義的XML值
默認值參數可使用下列值:
值解釋
值屬性的默認值
#REQUIRED屬性值是必需的
#IMPLIED屬性不是必需的
#FIXEDvalue屬性值是固定的
規定一個默認的屬性值
DTD:
<!ELEMENTsquareEMPTY>
<!ATTLISTsquarewidthCDATA"0">
合法的XML:
<squarewidth="100"/>
在上面的例子中,"square"被定義為帶有CDATA類型的"width"屬性的空元素。如果寬度沒有被設定,其默認值為0。

實體

實體是用於定義引用普通文本或特殊字元的捷徑的變數。
實體引用是對實體的引用。
實體可在內部或外部進行聲明。
一個內部實體聲明
語法:
<!ENTITY實體名稱"實體的值">
DTD例子:
<!ENTITYwriter"BillGates">
<!ENTITYcopyright"Copyright具體的url">XML例子:
<author>&writer;&copyright;</author>注釋:一個實體由三部分構成:一個和號(&),一個實體名稱,以及一個分號(;)。
一個外部實體聲明
語法:
<!ENTITY實體名稱SYSTEM"URI/URL">
DTD例子:
<!ENTITYwriterSYSTEM"具體的url">
<!ENTITYcopyrightSYSTEM"具體的url">XML例子:
<author>&writer;&copyright;</author>。

實例

報紙文章
<!DOCTYPENEWSPAPER[
<!ELEMENTNEWSPAPER(ARTICLE+)>
<!ELEMENTARTICLE(HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENTHEADLINE(#PCDATA)>
<!ELEMENTBYLINE(#PCDATA)>
<!ELEMENTLEAD(#PCDATA)>
<!ELEMENTBODY(#PCDATA)>
<!ELEMENTNOTES(#PCDATA)>
<!ATTLISTARTICLEAUTHORCDATA#REQUIRED>
<!ATTLISTARTICLEEDITORCDATA#IMPLIED>
<!ATTLISTARTICLEDATECDATA#IMPLIED>
<!ATTLISTARTICLEEDITIONCDATA#IMPLIED>
<!ENTITYNEWSPAPER"VervetLogicTimes">
<!ENTITYPUBLISHER"VervetLogicPress">
<!ENTITYCOPYRIGHT"Copyright1998VervetLogicPress">

]>
產品目錄
<!DOCTYPECATALOG[
<!ENTITYAUTHOR"JohnDoe">
<!ENTITYCOMPANY"JDPowerTools,Inc.">
<!ELEMENTCATALOG(PRODUCT+)>
<!ELEMENTPRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLISTPRODUCT
NAMECDATA#IMPLIED
CATEGORY(HandTool|Table|Shop-Professional)"HandTool"
PARTNUMCDATA#IMPLIED
PLANT(Pittsburgh|Milwaukee|Chicago)"Chicago"
INVENTORY(InStock|Backordered|Discontinued)"InStock">
<!ELEMENTSPECIFICATIONS(#PCDATA)>
<!ATTLISTSPECIFICATIONS
WEIGHTCDATA#IMPLIED
POWERCDATA#IMPLIED>
<!ELEMENTOPTIONS(#PCDATA)>
<!ATTLISTOPTIONS
FINISH(Metal|Polished|Matte)"Matte"
ADAPTER(Included|Optional|NotApplicable)"Included"
CASE(HardShell|Soft|NotApplicable)"HardShell">
<!ELEMENTPRICE(#PCDATA)>
<!ATTLISTPRICE
MSRPCDATA#IMPLIED
WHOLESALECDATA#IMPLIED
STREETCDATA#IMPLIED
SHIPPINGCDATA#IMPLIED>
<!ELEMENTNOTES(#PCDATA)>
]>
圖書館
<!DOCTYPEbooks[
<!--公共標識符:"-//LIBRARY//BDATA/DTD/BOOKDTD"--> 
<!ENTITY%attrib"(every|default)"> 
<!--設定類型的臨時實體--> 
<!ELEMENTbooks(book*)> 
<!--圖書館圖書元素--> 
<!ELEMENTbook(name,id,attrib+,description?,writer?,corp?,comment?)>
<!--一本圖書的元素--> 
<!ELEMENTname(#PCDATA)> 
<!--名字--> 
<!ELEMENTidEMPTY>
<!--ID(空)--> 
<!ATTLISTididID#REQUIRED> 
<!--ID屬性--> 
<!ELEMENTattribEMPTY> 
<!--類型(空)--> 
 <!ATTLISTattribattrib%attrib;"default"> 
 <!--類型屬性--> 
<!ELEMENTdescription(#PCDATA)> 
<!--描述--> 
 <!ELEMENTwriter(#PCDATA)> 
<!--作者--> 
<!ELEMENTcorp(#PCDATA)> 
 <!--出版社--> 
<!ELEMENTcomment(#PCDATA)> 
<!--注釋--> 
<!ENTITYlibrary"OurLibrary"> 
<!--定義圖書館產權實體-->
]>

優劣

DTD的優勢
每一個XML文檔都可攜帶一個DTD,用來對該文檔格式進行描述,測試該文檔是否為有效的XML文檔。既然DTD有外部和內部之分,當然就可以為某個獨立的團體定義一個公用的外部DTD,那么多個XML文檔就都可以共享使用該DTD,使得數據交換更為有效。甚至在某些文檔中還可以使內部DTD和外部DTD相結合。在應用程式中也可以用某個DTD來檢測接收到的數據是否符合某個標準。
對於XML文檔而言,雖然DTD不是必須的,但它為文檔的編制帶來了方便。加強了文檔標記內參數的一致性,使XML語法分析器能夠確認文檔。如果不使用DTD來對XML文檔進行定義,那么XML語法分析器將無法對該文檔進行確認。
元素的定義
根元素的聲明
每個XML文檔都只有一個根元素,其它的子元素都包含在該根元素中。因此在DTD中對根元素的聲明是必不可少的。根元素聲明的一般形式如下:
<!DOCTYPEroot[
<!--子元素-->]>
<!--檔案體-->
DOCTYPE是“documenttype”(文檔類型)的簡寫,DOCTYPE聲明必須放在文檔最頂部,在所有代碼和標識之上,DOCTYPE聲明是必不可少的關鍵組成部分。DTD語法要求DOCTYPE必須要大寫,而且DOCTYPE和元素之間必須要有空格隔開。如在以上代碼中DOCTYPE和根元素root之間要有空格隔開。
DTD的缺陷
利用DTD驗證有效性的解析器,就能夠立即對文檔的完整性進行可靠的檢查。DTD雖然比較實用,但DTD也有不少的缺陷。
DTD有自己的特殊語法,其本身不是XML文檔;
DTD只提供了有限的數據類型,用戶無法自定義類型;
DTD不支持域名機制。

相關詞條

相關搜尋

熱門詞條

聯絡我們