雖然目前的主流是使用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>
<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 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
參考資料: 1. Introduction to DTD
2. DTD tutorial
沒有留言:
張貼留言