XML系列:文檔類型定義DTD
一,什麼是DTD?
1,XMl是一種元標記語言,是描敘語言的語言,定義標記的語法結構,從而生成新標記。而DTD則是爲新標記建立文檔並進行規範說明。
也就是說XML定義標記的語法結構是通過DTD來定義,並指定文檔結構的規範,而XML文檔來使用標記。
2,自描述數據的規範。
二,DTD的作用
1,DTD定義了文檔中的元素(標記和屬性)和實體,以及相互關係。數據和結構分離。
2,通過DTD驗證XML文檔的有效性。DTD爲解析器提供瞭解析XML文檔的依據。所以每個XML文檔必須指定對於哪個DTD有效。
三,DTD的結構
1,元素的聲明:使用元素聲明來聲明XML文檔中的元素
⑴,帶有數據的元素:
<! ELEMENT 元素名 (數據類型)>
數據類型:
#CDATA:指元素包含不通過解析器解析的字符數據。特殊字符和保留字不需要轉義。
#PCDATA:指元素包括解析器可解析字符數據。特殊字符和保留字需要轉義纔可以通過解析器。
ANY:元素可以包含任何聲明類型的子元素和字符數據。
⑵,帶有子元素的元素:
<! ELEMENT 元素名 (子元素1名,子元素2名)>
多個子元素用逗號隔開。
在文檔中的順序和定義中的順序一致。
子元素可以有自己的子元素。
①相同元素只出現一次:
<! ELEMENT 元素名 (子元素)>
②相同元素至少出現一次:+
<! ELEMENT 元素名 (子元素+)>
③相同元素出現零次或多次:*
<! ELEMENT 元素名 (子元素*)>
④相同元素出現零次或一次:?
<! ELEMENT 元素名 (子元素?)>
⑶ ,空元素:
<! ELEMENT 元素名 (EMPTY)>
空元素可以有屬性
⑷,混合聲明
組可以是序列或選擇子元素和/或子組:
①序列
<! ELEMENT A (B)> : 元素A由單個子元素B組成.
<! ELEMENT A (B, C)> :元素A由子元素B和C組成.
<! ELEMENT A (B, (C | D), E> :元素A由子元素B ,E和選擇子組(C或D中之一)組成.
②選擇 子元素和/或子組
<! ELEMENT A (B | C)>:元素A由子元素選擇子組(B或C)組成.
<! ELEMENT A (B | C | (D, E))>:元素A由包括序列子組(D和E)的選擇(B或C或D,E之一)組成.
2,屬性的聲明
⑴空屬性
<! ATTTLIST 元素名 EMPTY>
⑵非空屬性
<! ATTLIST 元素名 屬性名 屬性類型 屬性值>
屬性值:
①,Default屬性值:指定一個默認值
<! ATTLIST 元素名 屬性名 屬性類型 "默認值" >
DTD示例:
<! ATTLIST 售價 貨幣單位 CDATA "人民幣">
XML示例:
<售價 貨幣單位 = "人民幣">10.90</售價>
②,Implied屬性值:可以不提供該屬性,該屬性也沒有默認值。
<! ATTLIST 元素名 屬性名 屬性類型 #IMPLIED >
DTD示例:
<! ATTLIST 售價 貨幣單位 CDATA #IMPLIED>
XML示例:
<售價>10.90</售價>
③,Required屬性值:必須提供該屬性,但可以沒有默認值。
<! ATTLIST 元素名 屬性名 屬性類型 #REQUIRED >
DTD示例:
<! ATTLIST 售價 貨幣單位 CDATA #REQUIRED>
XML示例:
<售價 貨幣單位 = "美元">10.90</售價>
④,Fixed屬性值:使屬性具有固定值,不可以更改。
<! ATTLIST 元素名 屬性名 屬性類型 #FIXED "固定值">
DTD示例:
<! ATTLIST 售價 貨幣單位 CDATA #FIXED "人民幣">
XML示例:
<售價 貨幣單位 = "人民幣">10.90</售價>
屬性類型:
①,Enumerated屬性類型:使默認值成爲一組固定值中之一。
<! ATTLIST 元素名 屬性名 (固定值A|固定值B|...) 默認固定值之一>
DTD示例:
<! ATTLIST 售價 貨幣單位 ("人民幣"|"美元"|"歐元") "人民幣">
XML示例:
<售價 貨幣單位 = "歐元">10.90</售價>
②,ID和IDREF屬性類型
1,ID:用於搜索某個元素的特定實例,每個元素都可以具有ID類型的屬性。
<! ATTLIST 元素名 屬性名 ID 屬性值>
DTD示例:
<! ATTLIST 售價 支付方式 ID #REQUIRED>
XML示例:
<售價 ID = "BOOK1">10.90</售價>
<售價 ID = "BOOK2">10.90</售價>
<售價 ID = "BOOK3">10.90</售價>
2,IDREF:指向一個元素,引用其他元素中的一個元素。
<! ATTLIST 元素名 屬性名 IDREF 屬性值>
DTD示例:
<! ATTLIST 售價 貨幣單位 ID #REQUIRED>
<! ATTLIST 售價 貨幣單位 IDREF #IMPLIED>
<! ATTLIST 售價 貨幣單位 CDATA #IMPLIED>
XML示例:
<售價 ID = "BOOK1" 貨幣單位 = "人民幣">10.90</售價>
<售價 ID = "BOOK2" IDREF = "BOOK1"></售價>
③,IDREFS屬性類型
指向多個元素ID,用空格分開。用於指向XML文檔中的相關元素列表。
<! ATTLIST 元素名 屬性名 IDREFS 屬性值>
四,使用DTD
1,內部DTD
XML聲明後在XDOCTYPE聲明中編寫內部DTD。
<! DOCTYPE 根元素名 [
元素聲明
。。。
]>
2,外部DTD
編寫DTD文件,擴展名爲DTD,在XML文檔DOCTYPE聲明中添加DTD引用,告訴解析器外部DTD信息,
<! DOCTYPE 根元素名 SYSTEM "DTD文件名.dtd">
3,DTD中的內部實體和外部實體和
參見:XML系列:XML文檔結構 中的實體;
4,DTD中的參數實體
先用內部DTD聲明,把參數實體設置爲元素名 ,在XML文件中引用 外部DTD驗證。
DTD文件
...
<! ENTITY %實體名 "字符數據">
<! ELEMENT 元素名 ( %實體名)>
<! ELEMENT %實體名 (子元素)>
...
XML文件
...
<! DOCTYPE 根元素名 SYSTEM “DTD文件名.dtd”[
<! ENTITY %實體名 "替換實體名的元素名">
]>
...
例子:不同元素的XML共同關聯一個DTD文件
DTD文件
...
<! ENTITY %element "e">
<! ELEMENT root ( %element)>
<! ELEMENT %element (name,sex,。。。)>
...
XML文件1
...
<! DOCTYPE root SYSTEM “DTD文件名.dtd”[
<! ENTITY %element "student">
]>
<root>
<student>
<name>張三學生</name>
...
<student>
</root>
XML文件2
...
<! DOCTYPE root SYSTEM “DTD文件名.dtd”[
<! ENTITY %element "teatcher">
]>
<root>
<teatcher>
<name>王五老師</name>
...
<teatcher>
</root>