有效的XML: DTD(文檔類型定義)介紹
文檔類型定義和命名空間
有效(Valid)的XML文檔:
首先,XML文檔是個格式正規的(Well-formed)XML文檔;(見格式正規的XML:語法 屬性 實體 處理指令 樣式單 CDATA節)。
其次,需要滿足DTD的要求,這樣的XML文檔稱為有效的(Valid)XML文檔。
DTD
DTD,即文檔類型定義——Document Type Definition。
DTD用來描述XML文檔的結構,
一個DTD文檔包含:
元素(ELEMENT)的定義規則;
元素之間的關系規則;
屬性(ATTLIST)的定義規則;
可使用的實體(ENTITY)或符號(NOTATION)規則。
DTD文檔與XML文檔實例的關系
類與對象;
數據庫表結構與數據記錄;
有了DTD,每個XML文件可以攜帶一個自身格式的描述。
有了DTD,不同組織的人可以使用一個通用DTD來交換數據。
應用程序可以使用一個標准DTD校驗從外部世界接收來的XML數據是否有效。
可以使用DTD校驗自己的XML數據。
如何生成DTD文檔
DTD文檔有三種應用形式:
1.內部DTD文檔
<!DOCTYPE 根元素[定義內容]>
2.外部DTD文檔
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑">
3.內外部DTD文檔結合
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑" [定義內容]>

內部DTD
一個內部DTD的例子:
上半部分是DTD,下面是XML文檔,文檔要符合DTD。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem [ <!ELEMENT poem (author, title, content)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)> ]> <!--為元素poem定義了三個子元素author title content, 這三個元素必須要出現並且必須按照這個順序 少元素不行,多元素也不行 --> <!--指明author,title,content里面的內容是字符串類型--> <poem> <author>王維</author> <title>鹿柴</title> <content>空山不見人,但聞人語聲。返景入深林,復照青苔上。</content> </poem>
上面的文檔就是格式良好,並且有效的。
詳見其中的注釋。
#PCDATA(Parsed Character Data) ,可解析的字符數據,即字符串。
上面部分是DTD,在下面編寫XML文檔時,如果不符合其DTD規范,用XMLSpy做檢查的時候,是well-formed的,但是卻不是valid的。
比如根元素寫:
<Students> </Students>
Validate檢查的時候就會報錯,根元素和DTD中的poem不符。
外部DTD
上面是一個內部DTD的例子,下面用一個外部的DTD:
首先,新建一個DTD文檔,文件名叫dtd_1.dtd,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT poem (author, title, content)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)>
然后,新建一個XML文檔。
如果只寫XML元素內容,那么它是一個格式良好的,卻不是有效的文檔,因為找不到DTD。
需要加入外部DTD文件的名稱(同一個路徑下只給出文件名即可)。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem SYSTEM "dtd_1.dtd"> <poem> <author>王維</author> <title>鹿柴</title> <content>空山不見人,但聞人語聲。返景入深林,復照青苔上。</content> </poem>
內外部DTD結合
DTD的內容也可以有些放在外部,有些放在內部,如下:
文件dtd_2.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)>
XML文檔:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem SYSTEM "dtd_2.dtd"[ <!ELEMENT poem (author, title, content)> <!ELEMENT content (#PCDATA)> ]> <poem> <author>王維</author> <title>鹿柴</title> <content>空山不見人,但聞人語聲。返景入深林,復照青苔上。</content> </poem>
參考資料
聖思園張龍老師XML視頻教程。
