一、什么是DTD
文檔類型定義(DTD:Document Type Definition)可定義合法的XML文檔構建模塊。它使用一系列合法的元素來定義文檔的結構。
DTD 可被成行地聲明於 XML 文檔中,也可作為一個外部引用。
二、DTD的作用
1、有了DTD,每個XML可以攜帶一個自身格式的描述。
2、有了DTD,不同組織可以使用一個通用的DTD來交換數據。
3、應用程序中使用DTD校檢從外部接受的XML數據是否有效。
三、DTD中包含的內容
1、元素的定義規則:在DTD中需要驗證XML中能包含哪些元素。
2、元素之間的關系規則:指元素的父元素是誰,元素和元素之間到底是上下層關系還是平行關系。
3、屬性的定義:可以規定在XML中屬性名是什么,屬性值是什么類型。
四、DTD的分類:
1、內部DTD文檔:DTD文檔和XML文檔在同一個文件中。
<!DOCTYPE 根元素 [定義內容]>
2、外部DTD文檔:DTD文檔和XML文檔保存在不同文件中。
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑">
3、內外結合的DTD文檔:兩種相結合的寫法。
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑" [定義內容]>
五、DTD元素定義
語法:
<!ELEMENT NAME CONTENT>
ELEMENT:關鍵字,表示聲明一個DTD文檔。
NAME:元素名稱,XML中元素的名稱。
CONTENT:元素類型,
元素類型包括:EMPTY、#PCDATA、純元素類型、ANY。
1、Empty:
該元素不能包含子元素和文本,但可以有屬性(空元素)。
語法:
<!ELEMENT 元素名稱 EMPTY>
例:聲明一個空的student元素
<!ELEMENT student empty>
XML示例:
<student />
2、#PCDATA:
可以包含任何字符數據,但不能包含其他子元素。只有 PCDATA 的元素通過圓括號中的 #PCDATA 進行聲明:
語法:
<!ELEMENT 元素名稱 (#PCDATA)>
例:聲明一個name的元素
<!ELEMENT name (#PCDATA)>
XML示例:
<name>張三</name>
3、純元素類型:
只能包含子元素,不能包含文本。元素出現的順序必須和定義一致。
語法:
<!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>
例:聲明學生標記
<!ELEMENT student(name,age)>
XML示例:
<student>
<name>張三</name>
<age>18</age>
</student>
符號的用途:
| 符號 | 用途 | 示例 | 說明 |
| () | 用來給元素分組 | (古龍|金庸|梁羽生),(王朔|余傑),毛毛 | 分為三組 |
| | | 在列出的對象中必須選擇一個 | (男人|女人) | 表示男人或者女人必須出現,兩者至少出現其一。 |
| , | 對象必須按照指定的順序出現 | (西瓜,蘋果,香蕉) | 表示西瓜、蘋果、香蕉必須出現,並且是按照指定順序出現。 |
| * | 該對象可以出現0次或者多次 | (愛好*) | 愛好可以出現0次到多次 |
| ? | 該對象只能出現0到1次 | (菜鳥?) | 表示菜鳥可以出現0次到1次 |
| + | 改對象可以出現1到多次。 | (成員+) | 表示成員必須出現1次到多次。 |
4、ANY:
可以包含任何元素類型。
語法:
<!ELEMENT 元素名稱 ANY>
例子:
<!ELEMENT student ANY>
例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE studentlist [ <!--聲明根元素下可以包含多個student元素--> <!ELEMENT studentlist (student*)> <!--聲明student下可以包含name,age,sex元素,name必須出現0-1次, age出現0-多次,sex必須出現1次 --> <!ELEMENT student (name?, age*, sex)> <!--聲明name中只能包含文本,不能包含其他標記--> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!--聲明sex為空元素--> <!ELEMENT sex EMPTY> ]> <studentlist> <student> <name>張三</name> <age>20</age> <sex/> </student> <student> <name>李四</name> <sex/> </student> </studentlist>
六、DTD中屬性的定義
語法:
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
說明:
ATTLIST:屬性列表關鍵字。
元素名稱:要修飾的元素名稱。
屬性名稱:元素誰能夠的名稱。
屬性類型:CDATA、ID、IDREF/IDREFS、Enumerated。
屬性特點:#REQUIRED、#IMPLIED、#FIXED value、Default value。
1)#REQUIRED:表示元素屬性都必須有該屬性的值,不能為空。
2)#IMPLIED:表示元素屬性可以忽略的值,可以為空。
3)#FIXED value:表示元素屬性必須為指定的固定值,固定值在value中指定。
4)Default value:表示給指定元素默認值,不需要使用Default,直接指定默認值即可。
屬性類型:
1、CDATA屬性
表示屬性值可以是任何字符,包括數字和中文。
示例:聲明student屬性name值為任何文本,必須有值
DTD示例:
<!ATTLIST student name CDATA #REQUIRED>
XML示例:
<student name="zhangsan" />
2、ID屬性
表示屬性取值必須是唯一的
示例1:對studentid屬性設置為唯一值。並且必須有值。
DTD示例:
<!ATTLIST student id ID #REQUIRED>
XML示例:
<student id="10086" />
示例2:同時對多個屬性設置屬性,對student的id
DTD示例:
<!ELEMENT student (id,name)>
<!ATTLIST student
id ID #REQUIRED
name CDATA #REQUIRED>
XML示例:
<student id="10086" name="zhangsan"></student>
3、IDREF/IDREFS
IDREF:表示該屬性的值指向其他地方聲明的ID類型的值。
IDREFS:同IDREF,但是可以由空格分開多個引用。
示例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE categories [ <!ELEMENT categories (category*)> <!ELEMENT category (category*)> <!ATTLIST category id ID #REQUIRED name CDATA #REQUIRED parentid IDREF #IMPLIED> <!--子類中的parentid引用外層的id--> ]> <categories> <category id="c_1" name="電器"> <category id="c_10" parentid="c_1" name="電視"/> <category id="c_11" parentid="c_1" name="冰箱"/> <category id="c_12" parentid="c_1" name="冰箱"/> </category> <category id="c_2" name="手機"> <category id="c_20" parentid="c_2" name="智能手機"/> <category id="c_21" parentid="c_2" name="非智能手機"/> </category> </categories>
4、Enumerated
枚舉,預定義一些值,屬性的值必須在所列出的值得范圍類。
DTD示例:學生性別只能是男或者女
<!ATTLIST student sex (男|女) #REQUIRED>
XML示例:
<student sex="男">
七、實體
在DTD中定義的常量,在XML中使用。用於定義在XML中多次出現的值。
實體可以分為內部實體和外部實體:
1、內部實體
語法:
<!ENTITY 實體名 "實體值">
示例:定義
DTD示例:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
XML示例:
<author>&writer;©right;</author>
注意:一個實體由三部分構成: 一個和號 (&), 一個實體名稱, 以及一個分號 (;)。
2、外部實體
語法:
<!ENTITY 實體名稱 SYSTEM "URI/URL">
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;©right;</author>
