DTD(Document Type Definition)文件類型描述
第一點要注意的:
DTD中的關鍵字必須全部大寫!
一、DTD的位置
DTD可以放在xml文檔里面:
出自《XML入門》
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 聯系人列表[
<!ELEMENT 聯系人列表 (聯系人)*>
<!ELEMENT 聯系人 (姓名,ID,公司,EMAIL,電話,地址)>
<!ELEMENT 地址 (街道,城市,省份)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 電話 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
]>
<聯系人列表>
................................... 放在里面的時候,應該注意“standalone = "yes"”
也可以放在外面,放在外面有兩種形式,一種是引用本地文件,如:
<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
<!DOCTYPE 聯系人列表 SYSTEM "fclml.dtd">
<聯系人列表>
.................. 引用的格式是:<!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URL">
另外一種是引用公共的文檔定義,如:
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> 格式為:<!DOCTYPE 根元素 PUBLIC "DTD名稱" "外部DTD的URL">
其中DTD名稱解釋為:
這個DTD標識的命名規則和XML文件的命名規則稍有不同。具體地說,DTD名稱只能包含字母、數字、空格和下面的符號:
_%$#@()+:=/!*;?。同時,DTD名稱還必須符合一些標準的規定。例如,ISO標準的DTD以“ISO”三個字母開頭;被改進的非ISO標準的DTD以加號“+”開頭;未被改進的非ISO標準的DTD以減號“-”開頭。
所以說struts的配置文件就是“未被改進的非ISO標準的DTD文檔”
二、DTD的內容
DTD文檔的內容總結下來有幾個比較重要也比較常用的:參數實體定義、元素定義和屬性定義
1、參數實體定義
實體實際上在XML當中充當宏定義或者別名之類的意思,也可以理解成public static String......
參數實體是專門用在DTD當中的,你可以在下面兩項元素定義和屬性定義中引用參數實體。
其定義方式如下:
<!ENTITY % 實體名 "實體內容"> 注意,在XML中的實體定義是沒有%的
或者是:
<!ENTITY % 實體名 SYSTEM "外部文件名">
引用方式:
%實體名
例子:
<!ENTITY % Boolean "(true|false|yes|no)">表示定義了一個Boolean 的參數實體,值是"(true|false|yes|no)"
在struts的配置文件的DTD中有如下描述:
<!ATTLIST form-bean dynamic %Boolean; #IMPLIED>
也就定義了form-bean這個元素的dynamic屬性可以取得值是true、false、yes、no其中之一。
2、元素定義
用來定義元素的格式以及元素的子孫等。
定義形式:
<!ELEMENT 元素名 元素內容描述>
元素定義這里由于篇幅有限,僅列幾個例子
1、<!ELEMENT 聯系人列表
ANY>表示聯系人列表這個元素的格式及其子孫都不受限制。
2、<!ELEMENT 姓名(#PCDATA)>表示姓名這個元素只能包含文本數據
3、<!ELEMENT 聯系人(姓名 EMAIL)>表示聯系人這個元素只能包含姓名和EMAIL兩種子孫,順序不限,并且姓名只能由一個,EMAIL也只能由一個。
4、<!ELEMENT 聯系人(姓名,EMAIL)>表示聯系人這個元素只能包含姓名和EMAIL兩種子孫,有順序的限制,并且姓名只能由一個,EMAIL也只能由一個。
5、<!ELEMENT 聯系人(姓名,EMAIL
+)>表示聯系人必須有且僅有一個姓名子孫,有一個到多個EMAIL子孫,其中,如果
+換作*,則表示零個或者多個。 6、<!ELEMENT 聯系人(姓名,EMAIL)+>表示聯系人有一組到多組子孫,每組中有且僅有一對姓名和EMAIL
7、<!ELEMENT 聯系人(姓名,(電話
|EMAIL))>表示聯系人有一組到多組子孫,每組中第一個元素一定是姓名,第二個元素要么是電話,要么是EMAIL,兩者選一個。
8、<!ELEMENT 聯系人
EMPTY>聯系人這個元素不包含任何子孫,也不包含文本。
3、屬性定義
格式:<!ATTLIST 元素名 (屬性名 屬性類型 缺省值)*>
例子:
1、<!ATTLIST 頁面作者
姓名 #CDATA #IMPLIED
年齡 #CDATA #IMPLIED
聯系信息 #CDATA #REQUIRED
網站職務 #CDATA #FIXED "頁面作者"
個人愛好 #CDATA "上網">
其中,定義了頁面作者這個元素的屬性可以有“姓名”,“年齡”,“聯系信息”,“網站職務”和“個人愛好”
并且,姓名和年齡是純文本,可以沒有,聯系信息必須有,網站職務一定是“頁面作者”,個人愛好如果不填,則默認是上網。
2、<!ATTLIST 肉 類型( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">元素肉可以有“類型”屬性,類型屬性可以選擇 雞肉 | 牛肉 | 豬肉 | 魚肉其中一個,默認是“雞肉”
3、<!ATTLIST 聯系人 編號 ID #REQUIRED>聯系人元素有且必須有編號屬性,其類型是ID型的,ID型或者是IDREF型的屬性值必須是一個有效的XML名稱,它由字母、數字或下劃線開始,名字中不能出現空白符。類似Html中的ID。
4、另外類型NMTOKEN和NMTOKENS還有NOTATION類型我還不是太明白,那位明白的不妨給出^_^。