XML中的DTD文件型別定義

哈哈哈哈哈我撒發表於2011-09-01

DTD:文件型別定義
DTD實際上可以看作一個或多個XML檔案的模板,這些XML檔案中的元素、元素的屬性、元素的排列方式/順序、元素能夠包含的內容等,都必須符合DTD中的定義。
DTD的分類:
DTD可以是一個完全獨立的檔案,也可以在XML檔案中直接設定。所以,DTD分為外部DTD(在XML檔案中呼叫另外已經編輯好的DTD)和內部DTD(在XML檔案中直接設定DTD)兩種。

比如,有幾十家相互聯絡的、合作伙伴關係的公司、廠商,他們相互之間的交換電子文件都是用XML文件。那麼我們可以將這些XML文件的DTD放在某個地方,讓所有交換的XML文件都使用此DTD,這是最方便的做法,同時也適用於公司內部的XML檔案使用。
內部DTD:
內部DTD是在XML檔案的檔案序言區域中定義的。語法:
〈!DOCTYPE element-name[........

]〉 
!DOCTYPE :表示開始設定DTD,注意DOCUTYPE是大寫。
〈Element-name :指定此DTD的根元素的名稱,一個XML檔案只能有一個根元素。注意,如果 XML檔案使用了DTD,那麼檔案中的根元素就在這裡指定 [.........]〉 :在[ ]標記裡面定義XML檔案使用元素,然後用〉結束DTD的定義。
下面,我們來看一下怎樣給XML檔案定義DTD,請見例1
例1:
==============================================================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 學生們[
<!ELEMENT 學生們 (學生*)>
<!ELEMENT 學生 (姓名+,年齡?,性別,愛好*)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年齡 (#PCDATA)>
<!ELEMENT 性別 (#PCDATA)>
<!ELEMENT 愛好 (#PCDATA)>
<!ATTLIST 學生 身份證號碼 ID #REQUIRED>
<!ATTLIST 學生 可選 CDATA #IMPLIED>
<!ATTLIST 學生 婚否 (未婚|已婚) "已婚">
<!ATTLIST 學生 是否好學生 CDATA "是">
<!ENTITY a "尹當">
]>
<學生們>
<學生 婚否="未婚" 身份證號碼="s4303211396786" 是否好學生="是" 可選="123">
<姓名>&a;</姓名>
<年齡>22</年齡>
<性別></性別>
<愛好></愛好>
<愛好></愛好>
</學生>
</學生們>
==============================================================================================
詳解例1(逐行分析):
1.<!DOCTYPE 學生們[:

以“學生們”為根節點,只能出現一次.
2.<!ELEMENT 學生們 (學生*)>:
設定“學生們”根節點可出現多個“學生子節點”.
3.<!ELEMENT 學生 (姓名+,年齡?,性別,愛好*)>:
設定”學生“節點後的子節點,加上特定的符號來控制標記出現的次數。這些符號見表1。
表1
----------------------------------------------------------
符號    代表標記出現的次數
?     不出現或只出現一次    
*     不出現或可出現多次
+     必須出現一次以上
無符號   只能出現一次

----------------------------------------------------------
例如:<!ELEMENT 學生 (姓名+,年齡?,性別,愛好*)>:
“姓名”標記必須出現一次以上;
“年齡”標記可以不出現或只出現一次;
“性別”標記必須出現而且只能出現一次
“愛好”標記在XML檔案中可以不出現或者出現多次;
4.<!ATTLIST 學生 身份證號碼 ID #REQUIRED>:
在學生節點中增加一個屬性“身份證號碼”:必須寫,為ID,不能重複值,並且值不能為數字開頭,關鍵字:#REQUIRED
5.<!ATTLIST 學生 可選 CDATA #IMPLIED>:
在學生節點中增加一個屬性“可選”:此屬性可寫可不寫,關鍵字:#IMPLIED.
6.<!ATTLIST 學生 婚否 (未婚|已婚) "已婚">:
在學生節點中增加一個屬性“婚否”:此屬性可寫可不寫,值必須是"未婚/已婚",相當於列舉,預設為"已婚".
7.<!ATTLIST 學生 是否好學生 CDATA "是">:
在學生節點中增加一個屬性“是否好學生”:此屬性可寫可不寫,有一個預設值:"是",但是也可以是其它的值.
8.<!ENTITY a "尹當">:
新增一個Entity實體,我們可以把Entity看作是一個常量,它有一定的值,本中例:&a;則相當於設定值"尹當",
引用Entity的時候,必須要在Entity名稱前面加上“&&”符號,後面加上“;”符號。
注:
屬性的取值範圍表:
==============================================================================================
屬性值類別    描述    
cdata           屬性值僅僅是一般的文字。    
enumerated   列出該屬性的取值範圍,一次只能有一個屬性值能夠賦予屬性。     
nmtoken     表示屬性值只能由字母、數字、下劃線、. 、:、-這些符號組成。    
nmtokens      表示屬性值能夠由多個nmtoken組成,每個nmtoken之間用空格隔開。     
id        該屬性在xml檔案中是唯一的,常用來表示人的身份證號碼。     
idref            表示該屬性值是參考了另一個id屬性。     
idrefs      表示該屬性值是參考了多個id屬性,這些id屬性的值用空格隔開。     
entity             表示該屬性的設定值是一個外部的entity,如一個圖片檔案。     
entities          該屬性值包含了多個外部entity,不同的entity之間用空格隔開。     
notation        屬性值是在dtd中宣告過的notation(宣告用什麼應用軟體解讀某些二進位制檔案,如圖片)。
==============================================================================================
外部DTD:
外部DTD是一個獨立於XML檔案的檔案,實際上也是一個文字檔案,只是使用.dtd為副檔名。因為外部DTD獨立於XML檔案,那麼它可以供多個XML檔案使用,就像用同一個模板可以寫出多個不同內容的檔案一樣,這多個XML檔案因為是引用同一個外部DTD,所以它們的結構大致相同。
外部DTD的建立方式、語法和內部DTD是一樣的,把例1的內部DTD的例子用外部DTD來寫,檔案如下所示。檔案存為字尾名為 .dtd的檔案。
-------------------------------------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 學生們 (學生*)>
<!ELEMENT 學生 (姓名+,年齡?,性別,愛好*)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年齡 (#PCDATA)>
<!ELEMENT 性別 (#PCDATA)>
<!ELEMENT 愛好 (#PCDATA)>
<!ATTLIST 學生 身份證號碼 ID #REQUIRED>
<!ATTLIST 學生 可選 CDATA #IMPLIED>
<!ATTLIST 學生 婚否 (未婚|已婚) "已婚">
<!ATTLIST 學生 是否好學生 CDATA "是">
<!ENTITY a "尹當">
-------------------------------------------------------------------------------------------------------------------------------------------------------除了沒有內部DTD中的〈!DOCTYPE 參考資料 [.....]〉語句外,其他都一樣。而且有關元素數目、排列順序、空元素設定、選擇性元素、Entity宣告、屬性設定等都和內部DTD是一樣的。
如何引用.dtd檔案:
1.〈!DOCTYPE element-name SYSTEM DTD-URL〉
2.〈!DOCTYPE element-name PUBLIC DTD-name DTD-URL〉

此語句必須位於XML檔案的檔案序言區,其中,〈!DOCTYPE表示開始宣告應用外部DTD;element-name是指該DTD的根元素的名稱;SYSTEM是指該外部DTD檔案是私有的,
即我們自己建立的,沒有公開發行,只是個人或在公司內部或者幾個合作單位之間使用;而PUBIC關鍵字是指該外部DTD是公用的,經過了公開討論,用PUBLIC的DTD都有一個邏輯名稱——DTD-name,我們必須在呼叫時指明這個邏輯名稱。
DTD-URL是用URL的方式指明外部DTD檔案的位置。例如,我們這份DTD檔案存放在URL為:http://www.xml.com/這個地方,檔名為ckzl.dtd。
那麼在XML檔案中的宣告如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 學生們 SYSTEM "http://www.xml.com/ckzl.dtd">
如存放於本機e:\ckzl.dtd
<!DOCTYPE 學生們 SYSTEM "e:\ckzl.dtd">
========================================

本文件有部分內容,借鑑於網路資料,感謝
========================================

相關文章