> DTD(文檔類型定義)的作用是定義 XML 文檔的合法構建模塊。這篇文章作簡單介紹下DTD的用法。想學習完整的請點擊下面w3c的教程。
### 1.[DTD官方教程](http://www.runoob.com/dtd/dtd-tutorial.html)
##2.xml約束技術:
DTD約束:語法相對簡單,功能也相對簡單。先出現
Schema約束:語法相對復雜,功能也相對強大。采用和xml語法類似的編寫方式,Schema約束出現就是為了替換DTD約束。
### 3.DTD簡介:
??文檔類型定義(DTD)可定義合法的XML文檔構建模塊。它使用一系列合法的元素來定義文檔的結構。DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
### 3.1導入DTD的方式:
1.內部導入:
~~~
#導入方式:
<!DOCTYPE root-element [element-declarations]>
#實例:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
~~~
1. (第二行)定義此文檔是 note(根標簽) 類型的文檔。
1. (第三行)定義 note 元素有四個元素(標簽):”to、from、heading,、body”
1. (第四行)定義 to 元素為 “#PCDATA” 類型
1. (第五行)定義 frome 元素為 “#PCDATA” 類型
1. (第六行)定義 heading 元素為 “#PCDATA” 類型
1. (第七行)定義 body 元素為 “#PCDATA” 類型
2.外部導入方式:
??本地文件:
~~~
#導入方式:
<!DOCTYPE note SYSTEM "note.dtd">
#note.dtd文件內容:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
~~~
??公共的外部導入:一般項目采用公共外部導入,比如ssh的xml文件基本上就是采用了這種方式
~~~
#導入方式:
<!DOCTYPE 根元素 PUBLIC "http://rlovep.com/peace.dtd">
#如hibernate.cfg.xml:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
~~~
### 3.2DTD語法:
??1.約束標簽
?語法:
~~~
<!ELEMENT 元素名稱 類別> 或 <!ELEMENT 元素名稱 (元素內容)>
~~~
?類別:
1. 空標簽: EMPTY。 表示元素一定是空元素.例如:<bb/>:
~~~
順序問題:
<!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>: 按順序出現子標簽
次數問題:
標簽 : 必須且只出現1次。
標簽+ : 至少出現1次
標簽* : 0或n次。
標簽? : 0 或1次。
聲明"非.../既..."類型的內容
~~~
??2.約束屬性:
?語法:
~~~
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
~~~
?屬性類型:
~~~
CDATA :表示普通字符串
(en1|en2|..): 表示一定是任選其中的一個值
ID:表示在一個xml文檔中該屬性值必須唯一。值不能以數字開頭
~~~
?默認值:
~~~
#REQUIRED 屬性值是必需的
#IMPLIED 屬性不是必需的
#FIXED value 屬性不是必須的,但屬性值是固定的
~~~
### 3.3測試如下,請細看注釋:
~~~
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from+,heading*,body?,(br|b))>
<!--帶有子序列的元素,需要按照先后順序出現;
to只能出現一次
from最少出現一次
heading次數隨意
body出現零次或者一次
非出現br就出現b
-->
<!--元素約束-->
<!ELEMENT to (#PCDATA)><!--pcdata元素-->
<!ELEMENT from ANY><!--任何內容的元素-->
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ELEMENT br EMPTY><!--空元素-->
<!ELEMENT b EMPTY><!--空元素-->
<!--屬性約束-->
<!ATTLIST to number CDATA #REQUIRED><!--必須有屬性值出現,且屬性值類型為字符串-->
<!ATTLIST from length CDATA "10"><!--默認屬性值,不寫出屬性時屬性值為10-->
<!--假如您不希望強制作者包含屬性,并且您沒有默認值選項的話,請使用關鍵詞 #IMPLIED。-->
<!ATTLIST heading length CDATA #IMPLIED>
<!ATTLIST body length CDATA #FIXED "123"><!--屬性擁有固定的值,并不允許作者改變這個值-->
<!ATTLIST br type (check|cash) "cash"><!--屬性值可以為check和cash中的一個-->
]>
<note>
<to number="1234">Tove</to>
<from>Jani</from>
<heading length="10">Reminder</heading>
<body length="123">Don't forget me this weekend</body>
<br type="check"/>
</note>
~~~