一、DTD介紹
?
Document Type Definition;
??????? DTD是一種XML的約束方式,除了此種約束方式外,還有XSchema,XSchema比DTD的約束能力還要強,因此DTD正在逐漸淘汰;
??????? DTD的目的就是約束XML標簽的寫法;比如在我們struts2開發當中,編寫struts.xml時,需要遵循的規則,就是通過DTD進行約束的,因此我們在開發當中通過Eclipse導入DTD文件,便于開發提示,如果在開發中開發人員不遵循DTD的規范,則會出現錯誤提示;
<struts><package name="" namespace="" extends=""><action></action> </package></struts>
??????? XML約束的重要性:在編寫XML時,對于XML進行約束是非常重要的,因為如果對于XML不約束,則會讓開發人員很難掌握;
??????? 而DTD通常是由框架設計人員定義的,一般的開發人員只需要在XML中遵循DTD規范編寫XML即可;
二、導入DTD
??????? 如果要導入DTD,可以通過兩種方式:
??????? (1)在XML中直接編寫;
??????? (2)在專門的DTD文件中編寫,然后在XML中通過特定的語句導入DTD文件;
??????? 1、在XML中直接編寫,語法如下:
- <!DOCTYPE?根節點[??
- ????.........??
- ]>?
?
??????? 此種方式需要考慮兩個情況:
? (1)如果是本地文件,則:
- ???? <!DOCTYPE?根節點?SYSTEM?"dtd的URL">??
?????????? 此處的URL指的是比如 "F:\1.dtd"
? (2)如果是共享文件,則:
- <!DOCTYPE?根節點?PUBLIC?"dtd名稱"?"dtd的URL">??
三、DTD語法
?
在DTD中可以定義XML標簽的順序、個數,屬性的值,實體;
?
1.XML元素定義
?
語法如下:
<!ELEMENT 元素名稱 元素類型>????????//定義元素的類型,但是只能是 ANY(表示任意類型)或EMPTY(空元素);
<!ELEMENT 元素名稱 (元素內容)>????//定義元素的內容,一定要加上();
?
對于元素內容,
----可以定義子元素的名稱,比如:
<!ELEMENT 元素名稱 (子元素1,子元素2,子元素3)> 表示3個子元素只能出現一次,并且按照此順序出現;
<!ELEMENT 元素名稱 (子元素1|子元素2|子元素3)> 表示3個子元素中只能出現一個;
我們還可以定義子元素的個數,比如:
(1)+:1次或多次;比如 (name+)表示此name元素只能出現1次或多次。
(2)?:0次或1次;比如(name?)表示此name元素只能出現0次或1次。
(3)*:0次或多次;比如(name*)表示此name元素任意出現幾次。
(4)無:只能一次;比如(name)表示此name元素只能出現1次。
對于元素內容,
----也可以定義子元素內容的類型,比如#PCDATA,表示字符串;
?
?
舉例:
- <!DOCTYPE?personlist?[????<!--?根節點為personlist-->??
- <!ELEMENT?personlist?(person+)>????<!--?personlist的子元素為person,并且可以出現1次或多次-->??
- <!ELEMENT?person?(name,age,salary)>????<!--?person的子元素是name,age,salary,并且可以出現一次,并且出現順序以此順序為準-->??
- <!ELEMENT?name?ANY>????<!--name可以使任意類型?-->??
- <!ELEMENT?age?(#PCDATA)>????<!--?age可以是字符串-->??
- <!ELEMENT?salary?(#PCDATA)>????<!--?salary可以是字符串-->??
- ]>??
- ???
從以上可以看出,DTD不可以定義數字等類型,此為DTD的缺陷;
?
2.XML屬性定義
?
語法如下:
<!ATTLIST 標簽名
????屬性名1????????屬性類型????????屬性說明
????屬性名2????????屬性類型????????屬性說明
>
屬性類型可以是
(1)CDATA:最普通的字符串;
(2)枚舉,即(值1|值2|值3),需要括號
(3)ID:屬性值需要以字母或下劃線開頭;
屬性說明可以是:
(1)#REQUIRED:必須設置;
(2)#IMPLED:可選值,即此屬性可以設置,也可以不設置;
(3)#FIXED:固定值,通常語法為:#FIXED? "固定值"
(4)默認值;
?
?? 舉例:
- <!DOCTYPE?personlist?[??
- ???
- <!ELEMENT?personlist?(person+)>??
- <!ELEMENT?person?(name,age,salary)>??
- <!ELEMENT?name?ANY>??
- <!ELEMENT?age?(#PCDATA)>??
- <!ELEMENT?salary?(#PCDATA)>??
- <!ATTLIST?person??
- aaa?CDATA?#REQUIRED????????<!--?-->??
- bbb?CDATA?#IMPLIED?????????<!--?可選屬性-->??
- ccc?CDATA?#FIXED?"xiazdong"?<!--固定值,不需要設置?-->??
- ddd?CDATA?"XZDONG"?????????<!--默認值為"XZDONG",?可以自己設置?-->??
- eee?ID?#REQUIRED?????????????<!--ID?-->??
- fff?(1|2|3)?"1"?????????????????????????<!--枚舉值,默認為1?-->??
- >??
- ]>??
?
3、XML實體定義
?
實體類似于一個可重用常量,或者說是ant中的classpath,可以被引用;
語法如下:
<!ENTITY 實體名稱? "實體內容">
引用實體語法:
&實體名稱;??? 注意:最后的“;”一定需要;
?
注意:引用實體必須在XML中引用;
?
舉例:
- <!DOCTYPE?personlist?[??
- ???
- <!ENTITY?constant?"aaaa">??
- <!ELEMENT?personlist?(person+)>??
- <!ELEMENT?person?(name,age,salary)>??
- <!ELEMENT?name?ANY>??
- <!ELEMENT?age?(#PCDATA)>??
- <!ELEMENT?salary?(#PCDATA)>??
- ???
- ]>??
- <personlist>??
- <person?>??
- <name>&constant;</name>????????<!--?引用constant實體-->??
- <age>aaa</age>??
- <salary>aaa</salary>??
- </person>??
- </personlist>??
- ???
小知識點:根據XML自動生成DTD
因為一般我們寫的XML基本都是沒有DTD的,如果要自己寫DTD,又很麻煩,因此我們可以通過工具來自動生成:trang
功能:能夠完成如下轉換:
(1)XML ---> DTD
(2)XML --->XSchema
(3)DTD--->XSchema
使用方法:
java -jar trang.jar -I xml -O dtd input.xml output.dtd 即可;
-I xml 表示輸入為xml;
-O dtd表示輸出為dtd文件;
input.xml表示輸入文件;
output.dtd表示輸出文件;