本篇的主題是要介紹驗證之DTD。
DTD 是 Data Type Definition 的縮寫,是 XML 界比較早期用來驗證資料格式正確性的做法(現在比較多使用的是 xsd,下一篇會提到),簡單說就是一套用來描述一份 XML 文件格式的語言,再一次,跟 XSL 一樣,一份 DTD 的型式,就是一份XML,大概長得像這樣。
這是用來描述下面這個XML的結構
接著大略說明 DTD 的內容
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD generated by XML Spy v4.4 U (http://www.xmlspy.com)-->
<!ELEMENT ipo:purchaseOrder (shipTo, billTo, Items)>
<!ATTLIST ipo:purchaseOrder
xmlns:xsi CDATA #REQUIRED
xmlns:ipo CDATA #REQUIRED
orderDate CDATA #REQUIRED
xsi:schemaLocation CDATA #REQUIRED
>
<!ELEMENT shipTo (name, street, city, postcode)>
<!ATTLIST shipTo
export-code CDATA #REQUIRED
xsi:type CDATA #REQUIRED
>
<!ELEMENT billTo (name, street, city, state, zip)>
<!ATTLIST billTo
xsi:type CDATA #REQUIRED
>
<!ELEMENT Items (item+)>
<!ELEMENT item (productName, quantity, price, ipo:comment?, shipDate)>
<!ATTLIST item
partNum CDATA #REQUIRED
>
<!ELEMENT name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT postcode (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT zip (#PCDATA)>
<!ELEMENT productName (#PCDATA)>
<!ELEMENT quantity (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT ipo:comment (#PCDATA)>
<!ELEMENT shipDate (#PCDATA)>
首先可以注意到的,就是 DTD「扁平化」的結構,由於 XML 不像一般 Row/Column的型式,所以為了要能以最簡單易懂的方式來描述,就採用了這種扁平化的結構。
所謂扁平化就是將整份文件結構切分成許多個小單位,然後再加以描述(註1)。而針對每個小單位,只描述三種可能的資訊:自己包含的欄位資料、自己包含的屬性資料以及在自己下一層有那些小單位(註2)。
Line 3:最外層的 ipo:purchaseOrder,裡面包含三個部份,分別是shipTo, billTo, Items
Line 4-9:描述 ipo:purchaseOrder包含那些屬性
Line 10:描述 shipTo,裡面包含四個欄位資料,分別是 name, street, city, postcode
Line 11-14:描述 shipTo 包含那些屬性
Line 16:描述 billTo,裡面包含五個欄位資料,分別是name, street, city, state, zip
Line 17-19:描述 billTo 包含那些屬性
Line 21:描述 Items 包含一個部份,是 item,那個 + 號表示可以出現多次
Line 23:描述 item,裡面包含五個欄位資料,分別是 productName, quantity, price, ipo:comment?, shipDate,其中那個 ? 號表示該欄位為optional使用
Line 24-26:描述 item 包含那些屬性
Line 28-38:定義所有欄位的屬性,其中 #PCDATA 是 XML 常用的資料型態
註1:這種觀念很重要,下一章節的 xsd 也是相同的概念及做法
註2:真的想要了解這種觀念,這裡有個小題目考考你,就是如何「只用一個資料表來儲存一家公司內所有主管與部屬的從屬關係」
本系列文章列表
Next : [XML]18-驗證之Schema
一直以為DTD是Disk To Disk的縮寫
還可以是 Door To Door 哦
會甚麼不是DOLLAR to DOOR...