2010年8月22日 星期日

什麼是 DTD (Document Type Definition)

XML提供了兩種文件的驗證機制,一個是DTD,另一個則是XML Schema
雖然目前的主流是使用XML Schema來驗證文件
我想還是盡量多了解一下DTD
並且把我所知道的部分做成筆記

DTD ( 文件類型定義, Document Type Definition),我把整個機制的重點放在Definition.
是用來訂出文件合法的區塊,也就是把元素的架構寫出來
語法<!DOCTYPE root-element [element-declarations]>
以上敘述有點難懂,還是來看一下範例

<?xml version="1.0" encoding="Big5"?>
<!DOCTYPE comic-list [
    <!ELEMENT comic-list (entry+)>
    <!ELEMENT entry       (author, title, rating)>
    <!ELEMENT author    (#PCDATA)>
    <!ELEMENT title         (#PCDATA)>
    <!ELEMENT rating     (#PCDATA)>
]>
<comic-list>
<entry>
     <author>井上雄彥</author>
      <title>灌籃高手</title>
      <rating>普遍級</rating>
</entry>
</comic-list>

從這邊可以看出entry這個父元素包含著author, title跟rating這些子元素
這就是這個元素區塊的架構
若是之後要再加入其他的漫畫列表
就必須照著DTD所定義的規範來依序加入entry, 且entry下面的子元素(author, title, rating)必須照順序來寫,另外,entry下面還要補上+或*號,表示這個檔案裡面有多筆entry, DTD也會依此來驗證此文件是否符合規定,大家都照規定來,一份完整且嚴謹的XML文件就可以互相使用

重新提醒一下, !DOCTYPE下面一定接根元素 (root element)
!DOCTYPE下面的第一行!ELEMENT也一定是根元素開頭
接下來再來定義根元素下面有幾個子元素,並且用括號()來刮起來
之後再來個別宣告子元素的type,像是(#PCDATA)之類的
若是該子元素又包著另一層的子元素
則不需宣告type,但要註明底下包著哪些子元素

譬如說

<?xml version="1.0" encoding="Big5"?>
<!DOCTYPE comic-list [
    <!ELEMENT comic-list (entry+)>
    <!ELEMENT entry       (author, title, rating)>
    <!ELEMENT author    (firstname, lastname)>
    <!ELEMENT firstname (#PCDATA)>
    <!ELEMENT lastname (#PCDATA)>
    <!ELEMENT title         (#PCDATA)>
    <!ELEMENT rating     (#PCDATA)>
]>


最上面的範例是從XML文件內宣告DTD的架構
還有另一種寫法是從外部文件內宣告
我將範例改寫如下


<?xml version="1.0" encoding="Big5"?>
<!DOCTYPE comic-list SYSTEM "comic-list.dtd"
<comic-list>
<entry>
     <author>井上雄彥</author>
      <title>灌籃高手</title>
      <rating>普遍級</rating>
</entry>
</comic-list>
接著再另外寫一份DTD的文件 (comic-list.dtd)好讓上述的XML文件讀取

<?xml version="1.0">
<!EEMENT comic-list (entry)>
<!ELEMENT entry       (author, title, rating)>
<!ELEMENT author    (#PCDATA)>
<!ELEMENT title         (#PCDATA)>
<!ELEMENT rating     (#PCDATA)>
這樣就是透過外部DTD來驗證XML文件架構的機制

以另一種觀點來看,DTD可以視為一種協議,不同的使用者可以透過共同訂制的DTD來交換資料,應用程式也可以透過DTD來驗證所接收的XML文件是否為有效的文件

參考資料: 1. Introduction to DTD
                  2. DTD tutorial

沒有留言:

張貼留言