什麼是DTD、爲什麼要用DTD?
文檔類型定義——Document Type Definition,DTD用來描述XML文檔的結構,一個DTD文檔包含:
- 元素(ELEMENT)的定義規則
- 元素之間的關係規則
- 屬性(ATTLIST)的定義規則
- 可使用的實體(ENTITY)或符號(NOTATION)規則
1、DTD文檔與XML文檔實例的關係:相當於類與對象或者數據庫表結構與數據記錄的關係
有了DTD,每個XML文件可以攜帶一個自身格式的描述。可以使用DTD校驗自己的XML數據
2、DTD文檔的聲明及引用:
- 內部DTD文檔:<!DOCTYPE 根元素 [定義內容]>
- 外部DTD文檔:<!DOCTYPE 根元素 SYSTEM "DTD文件路徑">
- 內外部DTD文檔結合:<!DOCTYPE 根元素 SYSTEM "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>王維</author>
- <title>鹿柴</title>
- <content>空山不見人,但聞人語聲</content>
- </poem>
以上是內部DTD文檔的XML文件
poem(author,title,content)表示poem元素有三個子元素,並且必須按照指定的順序出現;#PCDATA(Parsed Character Data),可解析的字符數據
定義一個外部的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文檔對DTD進行引用:
- <?xml version="1.0" encoding="UTF-8">
- <!DOCTYPE poem SYSTEM "dtd_1.dtd">
- <poem>
- <author>王維</author>
- <title>鹿柴</title>
- <content>空山不見人,但聞人語聲</content>
- </poem>
第二行是對外部dtd的引用。
3、元素的定義:
- 語法:<!ELEMENT NAME CONTENT>
!ELEMENT是關鍵字,NAME是元素的名稱,CONTENT是元素類型,元素類型有如下幾種:EMPTY——該元素不能包含子元素和文本,但可以有屬性(空元素);ANY——該元素可以包含任何在DTD中定義的元素內容;#PCDATA——可以包含任何字符數據,但不能在其中包含任何子元素;純元素類型——只能包含子元素,並且這些子元素外沒有文本;混合類型——包含子元素和文本數據的混合體。
DTD中的修飾符號:
舉例:<!ELEMENT poem (author+,title*,content?)>
4、屬性的定義
語法:<!ATTLIST 元素名稱 屬性名稱 類型 屬性特點>
類型有如下幾種:CDATA、ID、IDREF/IDREFS、NMTOKEN/NMTOKENS、Enumerated、ENTITY/ENTITIES、NOTATION、NOTATIONS
屬性特點主要有:#REQUIRED、#IMPLIED、#FIXED value、Default value
舉例:<!ATTLIST author name CDATA #REQUIRED>
CDATA——屬性值可以是任何字符(包括數字和中文);NMTOKEN/NMTOKENS——是CDATA的一個子集,表示屬性值必須是英文字母、數字、句號、破折號、下劃線或冒號,屬性值不能含有空格,NMTOKENS與NMTOKEN類似,包含多個由空格分隔的字符;ID——表示該屬性的取值必須是唯一的;IDREF/IDREFS——IDREF屬性的值指向文檔中其他地方聲明的ID類型的值,IDREFS同IDREF,但是可以具有由空格分開的多個引用;Enumerated——事先定義好一些值,屬性的值必須在所列出的值的範圍內。如:<!ATTLIST person 性別 (男|女) #REQUIRED>;
屬性的特點:#REQUIRED——必須有的;#IMPLIED——可以忽略該屬性,可有可無;#FIXED value——該屬性的值必須爲指定的固定值;Default value——爲屬性提供一個默認值;
5、實體類型:普通實體、外部實體、參數實體、外部參數實體
關於普通實體與參數實體
1) 普通實體是在dtd中定義,xml中使用,使用的時候格式爲:&address;
2) 參數實體是在dtd中定義,dtd中使用,定義的時候使用%,使用的時候也需要使用%, %address;
3) 外部普通實體的定義方式是:<!ENTITY address SYSTEM “http://www.shengsiyuan.com/xml.xml”>
表示使用http://www.abc.com/xml.xml網址的內容來替換掉address,而不是使用http://www.abc.com/xml.xml字符串本身來替換掉address
4)外部參數實體:<!ENTITY % address SYSTEM “http://www.abc.com/xml.xml”>,使用的時候:%address;
6、命名空間(Namespace)
使用原因:XML的元素名是不固定的,當兩個不同的文檔使用同樣的名稱描述兩個不同類型的元素的時候,就會發生命名衝突,
使用前綴解決命名衝突問題:<h:table></h:table>與<f:table></f:table>類似與java的pakage
使用命名空間屬性:<h:table xmlns:h="http://www.abc.com/tr/html4/"></h:table>,使用全球唯一的url表示