XML文檔類型定義DTD

DTD概述

DTD用來定義XML文檔的結構,它包含一系列規則說明,以確保XML文檔的一致性和有效性
DTD定義了XML文檔可用的詞彙(元素和屬性的名稱)和結構:
元素名稱,包括根元素
元素的屬性及屬性的數據類型和取值方式
子元素的名稱、順序、出現次數
元素是否擁有子元素,是否能擁有文本內容,等等
可以用DTD驗證XML文檔
發現書寫錯誤(命名錯誤)
檢查結構和順序
檢查是否使用了規定的規範文檔

DTD的引用

DTD可以是被XML引用的獨立的外部文檔,也可以嵌入到XML文檔中
DTD文檔是特殊格式的XML文檔 例如,DTD文檔student.dtd的內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 班級 (學生+)>
<!ELEMENT 學生 (ID, 姓名, 年齡?, 住址?, 電話*)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年齡 (#PCDATA)>
<!ELEMENT 住址 (#PCDATA)>
<!ELEMENT 電話 (座機*, 手機?)>
<!ELEMENT 座機 (#PCDATA)>
<!ELEMENT 手機 (#PCDATA)>

嵌入的DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班級 [
	<!ELEMENT 班級 (學生+)>
	<!ELEMENT 學生 (ID, 姓名, 年齡?, 住址?, 電話*)>
	<!ELEMENT ID (#PCDATA)>
	<!ELEMENT 姓名 (#PCDATA)>
	<!ELEMENT 年齡 (#PCDATA)>
	<!ELEMENT 住址 (#PCDATA)>
	<!ELEMENT 電話 (座機*, 手機?)>
	<!ELEMENT 座機 (#PCDATA)>
	<!ELEMENT 手機 (#PCDATA)>
]>
<班級>
	<學生>
		<ID>001</ID>
		<姓名>王剛</姓名>
		<年齡>2</年齡>
		<電話>
			<手機>234345456</手機>
		</電話>
	</學生>
</班級>

外部DTD-SYSTEM
在XML文檔中聲明使用外部DTD文檔 <!DOCTYPE 根元素名稱 SYSTEM “DTD文檔URL”>
 例如,XML文檔student.xml的內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班級 SYSTEM “student.dtd”>
<班級>
	<學生>
		<ID>001</ID>
		<姓名>王剛</姓名>
		<年齡>2</年齡>
		<電話>
			<手機>234345456</手機>
		</電話>
	</學生>
</班級>

外部DTD-PUBLIC
在XML文檔中聲明使用公共DTD文檔 <!DOCTYPE 根元素名稱 PUBLIC “公共標識符” “URI” 公共標識符的格式爲:  標準//作者//類型和版本//語言 例如,XML文檔student.xml的內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班級 PUBLIC “-//WeiDP//Example 1.0//ZH-CN” “student.dtd”>
<班級>
	<學生>
		<ID>001</ID>
		<姓名>王剛</姓名>
		<年齡>2</年齡>
		<電話>
			<手機>234345456</手機>
		</電話>
	</學生>
</班級>

元素Element

ANY:內容中可包含子元素
格式:<!ELEMENT 元素名稱 ANY>
示例:<段落>使用<關鍵詞>XML</關鍵詞>技術</段落>
EMPTY:不能包含任何內容
格式:<!ELEMENT 元素名稱 EMPTY>
示例:<paper color=“red”/>
#PCDATA:不能包含子元素
格式:<!ELEMENT 元素名稱 (#PCDATA)>
示例:<book author=“Black”>C Language</book>
子元素的順序和出現頻率
<!ELEMENT 元素名稱 (子元素名稱[修飾符][,…])>
其中,修飾符爲:
省略:必須出現,且只能出現1次
+:至少出現1次
?:最多出現1次
*:可以不出現,也可以出現多次
示例:<!ELEMENT cpu (廠商,型號+,工藝?,價格*)>
子元素的選擇
<!ELEMENT 元素名稱 (子元素[|子元素]…]) >
示例: <!ELEMENT 電話 (座機|手機)>

<?xml version="1.0" encoding="GB2312" standalone="no"?>
<!DOCTYPE 我的電腦 [
	<!ELEMENT 我的電腦 (CPU, 內存+, 硬盤+)>
	<!ELEMENT CPU EMPTY>
	<!ELEMENT 內存 (描述*)>
	<!ELEMENT 分區 (名稱, 操作系統)>
	<!ELEMENT 名稱 (#PCDATA)>
	<!ELEMENT 操作系統 (#PCDATA)>
	<!ELEMENT 硬盤 (分區+, 描述*)>
	<!ELEMENT 描述 ANY>
]>
<我的電腦>
	<CPU/>
	<內存><描述>="512MB"</描述></內存>
	<內存/>
	<硬盤>	<分區>
			<名稱>系統盤</名稱>
			<操作系統>Windows 2003</操作系統>
		</分區>
		<描述>關於系統盤的任何描述信息</描述>
	</硬盤>
</我的電腦>

屬性列表ATTLIST

ATTLIST定義元素的屬性的名稱、類型和默認值,可以限制出現次數但不能限制出現順序
語法:<!ATTLIST 元素名稱  屬性1名稱 屬性類型 屬性值聲明  屬性2名稱 屬性類型 屬性值聲明 ……>
屬性類型
CDATA:一般文本
ID:具有ID屬性值,不能重複(唯一性)
IDREF:對ID屬性值的引用
IDREFS:對ID屬性值列表的引用(用空白分割)
ENTITY:引用未解析的外部實體
ENTITIES:引用ENTITY列表(用空白分割)
NMTOKEN:包含一個有效的XML名稱
NMTOKENS:NMTOKEN列表
(屬性值[[|屬性值]…]):屬性爲NMTOKEN類型,只能取列表中的值
NOTATION (屬性值[[|屬性值]…]):屬性爲NOTATION(已定義的),取值任選其一
屬性值說明
#REQUIRED:該屬性必須出現
#IMPLIED:該屬性是可選的
“默認值”:屬性是可選的;若不出現,在驗證文檔後,元素將隱含該屬性,取默認值
#FIXED “固定值”:屬性是可選的;若出現,屬性值必須取固定值;若不出現,則驗證後自動隱含該固定值
例如:

<?xml version="1.0" encoding="GB2312"?>
<!—該文件保存爲computer.dtd-->
<!ELEMENT 我的電腦 (CPU, 內存+, 硬盤+)>
<!ELEMENT CPU EMPTY>
<!ATTLIST CPU
	廠商 (AMD | Intel | Other) “Intel"
	序列號 CDATA #IMPLIED
	工作頻率 CDATA #REQUIRED
>
<!ELEMENT 內存 (描述*)>
<!ATTLIST 內存
	容量 CDATA #REQUIRED
>
<!ELEMENT 分區 (名稱, 操作系統)>
<!ATTLIST 分區
	盤符 NMTOKEN #REQUIRED
>
<!ELEMENT 名稱 (#PCDATA)>
<!ELEMENT 操作系統 (#PCDATA)>
<!ELEMENT 硬盤 (分區+, 描述*)>
<!ATTLIST 硬盤
	容量 CDATA #REQUIRED
>
<!ELEMENT 描述 ANY>

xml

<?xml version="1.0" encoding="GB2312" standalone="no"?>
<!DOCTYPE 我的電腦 SYSTEM "computer.dtd">
<!--以上部分稱爲XML文檔的“序言”(Prolog)-->
<我的電腦>
	<CPU 廠商="AMD" 工作頻率="1.5GHz"/>
	<內存 容量="512MB">
		<描述>Kingmax DDR 4000</描述>
	</內存>
	<內存 容量="512MB"/>
	<硬盤 容量="80GB">
		<分區 盤符="C">
			<名稱>系統盤</名稱>
			<操作系統>
				<![CDATA[> Windows 2003 <]]>
			</操作系統>
		</分區>
	</硬盤>
</我的電腦>

示例二

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班級 [
	<!ELEMENT 班級 (學生+, 班長?)>
	<!ELEMENT 班長 EMPTY>
	<!ATTLIST 班長 學號 IDREF #REQUIRED>
	<!ELEMENT 學生 (姓名, 年齡?, 住址?, 電話*)>
	<!ATTLIST 學生
		學號 ID #REQUIRED
		性別 (男 | 女) "男"
		系別 CDATA "計算機"
	>
	<!ELEMENT 姓名 (#PCDATA)>
	<!ELEMENT 年齡 (#PCDATA)>
	<!ELEMENT 住址 (#PCDATA)>
	<!ELEMENT 電話 (座機*, 手機?)>
	<!ELEMENT 座機 (#PCDATA)>
	<!ELEMENT 手機 (#PCDATA)>
]>

xml

<班級>
	<學生 學號="s05601" 性別="女">
		<姓名>王剛</姓名>
		<年齡>2</年齡>
		<電話>
			<手機>234345456</手機>
		</電話>
	</學生>
	<學生 學號="S05046" 性別="男" 系別="材料">
		<姓名>孫俊</姓名>
		<住址>203房間</住址>
	</學生>
	<學生 學號="s05603">
		<姓名>孫俊</姓名>
		<住址>203房間</住址>
		<電話>
			<座機>45655656
		</座機>
			<座機>465675</座機>
		</電話>
	</學生>
	<班長 學號="s05601"/>
</班級>

註記notation
XML文檔可以包含非XML數據(不能由解析器直接處理),例如圖像、聲音等,需要告知解析器如何調用外部程序處理這些數據,否則就會出錯。
NOTATION將非XML數據描述爲一種能夠被外部程序處理的形式
格式:<!NOTATION 名稱 SYSTEM “系統標識符”>
例如:<!NOTATION jpg SYSTEM “image/jpeg”>
notation實例

<?xml version="1.0" encoding="GB2312"?>
<!ELEMENT 相冊 (照片)+>
<!ELEMENT 照片 (#PCDATA)>
<!NOTATION jpg SYSTEM "image/jpeg">
<!NOTATION gif SYSTEM "image/gif">
<!NOTATION png SYSTEM "image/png">
<!ATTLIST 照片
	名稱 NMTOKEN #REQUIRED
	文件類型 NOTATION (jpg | gif | png) #IMPLIED
>

實體ENTITY

邏輯上,一個XML文檔只有一個根元素,根元素包含所有子元素和內容。但XML文檔中可以引用來自其他文檔(文件)中的數據(內容),這就是實體。例如,可以將論文標題定義爲實體,就可以在文中多次引用,而不必重複輸入,也便於修改標題。
實體存儲的內容有形式規範的XML、其他形式的文本或二進制數據。實體可以是文件、數據記錄或任何包含數據的項目。除了文檔實體外,多數實體都有名稱。
實體定義在DTD中,在與該DTD關聯的XML文檔中通過實體引用使用這些實體,XML解析器會在解析標記時,用實體的內容替換實體引用。

普通實體
  內部普通實體
<!ENTITY 實體名稱  “實體內容”>
例如,<!ENTITY UPC “中國石油大學”>
  外部普通實體
<!ENTITY 實體名稱 SYSTEM “URI”>
例如,<!ENTITY UPC SYSTEM “/XML/upc.xml”>
<!ENTITY 實體名稱 PUBLIC FPI “URI”>
其中,FPI是經認可的全球唯一的公共標識符,形如“前綴//使用者標識//文本類//文本描述//語言”
例如,<!ENTITY hello PUBLIC “-//ISO9//me//Hello//EN” “/xml/hello.xml”>
book_intro.xml文檔

<?xml version="1.0" encoding="GB2312"?>
<內容簡介>適合計算機專業本科學習</內容簡介>
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE 圖書 [
	<!ENTITY copyright "版權所有,2007">
	<!ENTITY intro SYSTEM "book_intro.xml">
	<!ELEMENT 圖書 (書名, 作者, 內容簡介)>
	<!ELEMENT 書名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 內容簡介 (#PCDATA)>
]>
<圖書>
	<書名>計算概論(©right;)
</書名>
	<作者>張三</作者>
	&intro;
</圖書>

未解析實體

外部未解析實體可以將非XML文檔數據引入XML文檔進行處理
引入XMl文檔
<!ENTITY 名稱 SYSTEM “URI”>
URI對應XML文檔
引入非XML文檔
<!ENTITY 名稱 SYSTEM “URI” NDATA 類型聲明>
類型聲明用於描述文檔類型

<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE IMAGE [
	<!ELEMENT IMAGE (PIC)>
	<!NOTATION gif SYSTEM "image/gif">
	<!ENTITY pic SYSTEM "office.gif" NDATA gif>
	<!ELEMENT PIC EMPTY>
	<!ATTLIST PIC src ENTITY #REQUIRED>
]>
<IMAGE>
	<PIC src="pic"/>
</IMAGE>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章