大三第3章dtd技術_第1頁
大三第3章dtd技術_第2頁
大三第3章dtd技術_第3頁
大三第3章dtd技術_第4頁
大三第3章dtd技術_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

模塊三

DTD技術《XML程序設計》目錄3.1

DTD的一般結構3.2

DTD在XML文檔中的引用3.3

驗證DTD文檔3.4

DTD中的元素聲明3.5

DTD中的屬性聲明什么是DTDDTD

(Document

Type

Definition,文檔類型定義)DTD用來指定XML

文檔怎樣組織數據(即數據結構)。例如,規定XML文檔中可以有哪些元素,一個元素有哪些屬性,元素之間如何嵌套等。一個格式良好的XML

文檔,如果遵守DTD規則,被稱為有效的XML文件。DTD示例<?xml

version="1.0"

encoding="UTF-8"

?><!DOCTYPE

students[<!ELEMENT

students

(student)*><!ELEMENT

student

(name,sex,age)><!ELEMENT

name

(#PCDATA)><!ELEMENT

sex

(#PCDATA)><!ELEMENT

age

(#PCDATA)>]><students><student><name>李剛</name><sex>男</sex><age>19</age></student><student><name>王麗</name><sex>女</sex><age>18</age></student></students>DTD

聲明ch3_1.xml文件<!DOCTYPE

根標記[<!ELEMENT

元素名元素類型><!ATTLIST

元素名

屬性名

[對屬性的約束規則]

默認值>]>聲明一個元素在XML

中,元素是文檔的一個邏輯組件,屬性表示一個元素的特征DTD

的一般結構:聲明一個屬性DTD的一般結構使用DTD生成XML

文檔驗證接收到的數據是否有效用于驗證自己的數據定義XML

文檔的合法構建塊DTD以簡單文本文件的形式出現,可以存儲在獨立的文件中,也可以嵌入XML

文件引用DTD

的XML

文檔將包含<!DOCTYPE>聲明使用一系列合法元素來定義文檔結構PUBLICDTD分為兩大類內部DTD外部DTDSYSTEMDTD分類1、內部DTD引用一個只使用內部DTD進行有效性檢驗的XML文檔的基本結構如下:DTD在XML文檔中的引用<?xml

version="1.0"

encoding="UTF-8"

?><!DOCTYPE

根元素名[DTD的內容]>2、外部DTD引用一個DTD文件的基本結構:<?xml

version="1.0"

encoding="UTF-8"

standalone="no"?>……元素、屬性或實體的DTD聲明部分……DTD在XML文檔中的引用外部DTD引用根據兩種不同的外部DTD文件,有兩種引用方式。引用私有DTD文件引用私有DTD文件的語法為:<!DOCTYPE根元素名SYSTEM

“DTD_URL”>引用公共DTD文件引用公共DTD文件的語法為:<!DOCTYPE根元素名PUBLIC

“DTD_Name”“DTD_URL”>外部DTD示例<?xml

version="1.0"

encoding="UTF-8"

?><!ELEMENT

students

(student)*><!ELEMENTstudent

(name,sex,age)><!ELEMENTname

(#PCDATA)><!ELEMENT

sex

(#PCDATA)>exp1.dtd文件<!ELEMENT

age

(#PCDATA)><?xml

version="1.0"

encoding="UTF-8"

?><!DOCTYPE

students

SYSTEM

"exp1.dtd"><students><student><name>李剛</name><sex>男</sex><age>19</age></student><student><name>王麗</name><sex>女</sex><age>18</age></student></students>ch3_2.xml文件檢查XML文件的有效性解析器類型非驗證解析器驗證解析器檢查文檔格式是否良好使用DTD

檢查文檔的有效性XML文檔的有效性檢驗就是根據DTD聲明中定義的約束條件來驗證文檔中標記的使用是否合法。本章使用DOM解析器TestValidate.java來檢驗XML文件的有效性。檢查XML文件的有效性DTD中的元素(ELEMENT)是用來約束標記的,用元素聲明來定義一個標記,元素聲明以“<!ELEMENT”開始,用“>”結束,格式為:<!ELEMENT

標記名稱標記的約束>例如:<!ELEMENT

name

(#PCDATA)>這段代碼定義了一個標記,名稱為name,它標記的內容只能含有文本數據。DTD中的元素聲明如果想要定義一個標記含有哪些子標記以及子標記應該以怎樣的順序出現或出現的次數,這些內容都要在

“標記的約束”中定義。標記的約束有以下5種情況:EMPTYANY字符數據#PCDATA包含子標記(子標記列表)混合內容(既有字符數據,又有子標記)DTD中的元素聲明(1)EMPTY關鍵字EMPTY用于定義空標記,空標記不含有任何標記內容。例如,對于下面的一個空標記:<abc

/>在DTD中聲明該標記的語法是:<!ELEMENT

abc

EMPTY>DTD中的元素聲明(2)ANY使用關鍵字ANY就意味著該標記可以包含該DTD中定義的其他任何標記,多用于定義根標記。例如:<!ELEMENT

persons

ANY>這段代碼定義了一個名稱為persons的標記,它的子標記可以是在該DTD文件中定義的其他任何標記。說明:在DTD中應慎用ANY,因為,過多地使用

ANY會破壞文檔結構清晰這一原則。DTD中的元素聲明(3)#PCDATA如果約束條件是#PCDATA,說明該標記所標記的內容可以是除標記以外的任何字符。例如:<!ELEMENT

name

(#PCDATA)

>這段代碼定義了名稱為name的標記,同時規定了標記<name>所標記的內容只能是文本數據,不能含有子標記。DTD中的元素聲明(4)定義子標記標記的內容可以包含子標記,定義一個標記的子標記的語法格式為:<!ELEMENT

標記名稱(子標記列表)>例如:<!ELEMENT

student

(name,sex,age)>這段代碼定義了一個名稱為student的標記,該標記含有3個子標記<name>、<sex>和<age>。定義子標記時子標記的出現順序決定了XML文件中子標記出現的順序,這個次序不能違背。DTD中的元素聲明給通訊錄案例添加內部DTD(P20)給通訊錄案例添加外部DTD(P22)練習控制方法元素出現次數子元素列表確定的次數加“?”0次或1次加“*”0次或多次,即任意次加“+”1次或多次加“|”用于可選的子標記,代表“或”控制元素的出現次數DTD中引入了幾個特殊符號來說明子標記的出現情況,分別是“?”、“*”、“+”和“|”。DTD中的元素聲明<!DOCTYPE

學生基本情況[<!ELEMENT

學生基本情況(學生)+><!ELEMENT

學生(學號?,姓名,性別,班級,愛好*)><!ELEMENT

學號(#PCDATA)><!ELEMENT

姓名(#PCDATA)><!ELEMENT

性別(#PCDATA)><!ELEMENT

班級(#PCDATA)><!ELEMENT

愛好(#PCDATA)>]>h3_3.xml<?xml

version="1.0"

encoding="GB2312"standalone="yes"?>“+”表示至少出現1次“*”表示0次或多次“?”表示0次或1次DTD中的元素聲明DTD中的元素聲明<學生基本情況><學生><學號>200120101</學號><姓名>季慧奇</姓名><性別>女</性別><班級>01信管1</班級><愛好>繪畫</愛好></學生><學生><學號>200120113</學號><姓名>徐樂歡</姓名><性別>男</性別><班級>01信管1</班級></學生><學生><姓名>錢燦剛</姓名><性別>男</性別><班級>01信管1</班級><愛好>籃球</愛好><愛好>羽毛球</愛好><愛好>足球</愛好></學生></學生基本情況><!ELEMENT

聯系人(#PCDATA

|姓名|電話|EMAIL)*><聯系人><姓名>張三</張三><電話></電話><EMAIL>Mac

&rights;</EMAIL>這是關于張三的信息</聯系人>(5)定義混合內容標記混合內容是指標記內容可以有文本數據和子標記。標記約束條件是關鍵字“#PCDATA”和若干個子標記的

“或運算”,而且該“或運算”必須用小括號括起并尾加一個

“*”號,格式如下:<!ELEMENT

標記名稱

(#PCDATA|子標記1|子標記2…|子標記m)*>DTD中的元素聲明DTD的完整性一個完整的DTD,應滿足下面兩個條件:不能出現標記的嵌套標記的嵌套是指一個標記的子標記中又含有該標記的父標記,這種情況在DTD中是不允許出現的。例如:<!ELEMENT elem_a

(elem_b,elem_c)><!ELEMENT elem_b

(elem_a,elem_c)>這個DTD中的定義是錯誤的。必須確定每一個標記的約束條件對于XML文件中出現的每一個標記,在DTD中都應該有它所標記內容的約束。練習P39習題2:為XML文件編寫DTD文件DTD中的屬性聲明與標記的定義類似,屬性的定義也必須在DTD中聲明。DTD中屬性列表(ATTLIST)是用來約束標記的屬性的屬性的聲明以“<!ATTLIST”開始,用“>”結束,中間是標記名稱及其可以含有的屬性列表,其語法格式為:<!ATTLIST

標記名稱屬性名稱屬性類型屬性默認值情況屬性名稱屬性類型屬性默認值情況……>例如:<!ATTLIST

cartype

CDATA

“A6”color

CDATA

“red”max-speed

CDATA

“120”>也可以多次為一個標記定義屬性。例如:<!ATTLIST

car

type

CDATA

“A6”><!ATTLIST

car

color

CDATA

“red”><!ATTLIST

car

max-speed

CDATA

“120”>注意:XML文件中為每個標記添加的屬性,都應該在

DTD中聲明。即使是同名的屬性也要各自聲明。DTD中的屬性聲明屬性默認值情況屬性的默認值情況可以是:字符串、“#IMPLIED”、“#REQUIRED”或“#FIXED”和一個字符串,具體用法見下表:DTD中的屬性聲明屬性類型含義描述字符串XML標記必須含有該屬性,可以不明顯的添加,有默認值#IMPLIEDXML標記可以不含有該屬性,沒有默認值#REQUIREDXML標記必須含有該屬性,沒有默認值,必須顯式地添加#FIXED和一個字符串XML標記可以不含有該屬性,若添加了該屬性,其值是“#FIXED”后面的字符串,且不可改變。屬性類型含義描述CDATA文本數據枚舉類型把屬性的可能取值一一列舉,如:(male|female)ID屬性類型用于標識文檔中的標記,ID屬性的值必須是一個合法的XML名稱且在文檔中是唯一的IDREF/IDREFS類型IDREF類型用于引用同一文檔中另一個標記的ID值,IDREF屬性值必須是文檔中某個標記的ID屬性值。IDREFS是IDREF的復數形式,其值是若干個ID屬性值,之間用空格分開NMTOKEN/NMTOKENS類型NMTOKEN類型屬性值必須是有效的XML名稱,不能含有空格。

NMTOKENS是NMTOKEN的復數形式,可包含若干個有效XML名稱,可包含空格ENTITY/ENTITYS類型用于引用文檔中的不可解析的外部實體,其值必須是有效的XML名稱NOTATION類型用于將屬性的值和DTD中的<!NOTATION>聲明關聯屬性的類型屬性的類型有7種情況,各類型說明如下表:DTD中的屬性聲明<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

booklist[<!ELEMENT

booklist(book)*><!ELEMENT

book

(title,author,publisher,price)><!ELEMENT

title

(#PCDATA)><!ELEMENT

author

(name,address)><!ELEMENT

name

(#PCDATA)><!ELEMENT

address

(#PCDATA)><!ELEMENT

publisher

(#PCDATA)><!ELEMENT

price

(#PCDATA)><!ATTLIST

book

category

CDATA"計算機"><!ATTLIST

author

sex(男|女)"男"><!ATTLIST

book

id

ID

#REQUIRED>]>DTD中的屬性聲明<!DOCTYPE

borrowBook[<!ELEMENT

borrowBook

(book*,student)><!ELEMENT

book

(title,author,publisher,price)><!ELEMENT

title

(#PCDATA)><!ELEMENT

author

(name,address)><!ELEMENT

name

(#PCDATA)><!ELEMENT

address

(#PCDATA)><!ELEMENT

publisher

(#PCDATA)><!ELEMENT

price(#PCDATA)><!ATTLIST

book

id

ID

#REQUIRED><!ELEMENT

student

(SID,SName,Class,BorrowNumber)*><!ELEMENT

SID(#PCDATA)><!ELEMENT

SName

(#PCDATA)><!ELEMENT

Class

(#PCDATA)><!ELEMENT

BorrowNumber

(#PCDATA)><!ATTLIST

BorrowNumber

BID

IDREF#REQUIRED>]>DTD中的屬性聲明練習寫出以下products.xml文檔對應的DTD文件<?xml

version="1.0"

encoding="gb2312"

?><!DOCTYPE

products

SYSTEM

"products.dtd”><products><product

ID="P101"><name>XML解析器</name><unitPrice

type=“$”>100</

unitPrice

></product><product

ID="P102"><name>XML編輯器</name><unitPrice

>50</

unitPrice

></product></products>DTD中的實體DTD中的實體分為一般實體和參數實體一般實體簡稱為實體,指可以被XML文件在標記內容中通過實體引用使用的實體。參數實體專門用在DTD中。按實體內容的位置,分為內部實體和外部實體按是否可解析,分為可解析實體和不可解析實體解析器在解析XML文件數據時,會將實體應用部分替換為預定義實體的內容。內部實體與外部實體內部實體是實體內容包含在該DTD文件中的實體。定義內部實體的格式如下:<!ENTITY

實體名字“實體內容”>例如:<!ENTITY

PI

“3.14159”>外部實體是實體內容是該DTD文件以外的其他文件的實體。定義內部實體的格式如下:<!ENTITY

實體名字

SYSTEM “實體的URI”><!ENTITY

實體名字

PUBLIC “實體的URI”>例如:<!ENTITY

Note

SYSTEM

“a.txt”>DTD中的實體內部實體與外部實體實體引用:在XML文件中實體引用的格式為:&實體名稱;例如:圓周率的值是:&PI;解析器在解析時,就會將“&PI;”替換為

“3.14159”。注意:實體引用時,“&”、“實體名稱”和“;”之間都不能有空格。DTD中的實體文件03.txt的內容:這是外部實體,來自03.txt文件的內容<?xml

version="1.0"

encoding="UTF-8"

?><!DOCTYPE

實體引用[<!ENTITY

inen"我是內部實體"><!ENTITYouten

SYSTEM

"03.txt"><!ELEMENT

ent

(in,out)><!ELEMENT

in

(#PCDATA)><!ELEMENT

out

(#PCDATA)>]><ent><in>&inen;</in><out>&outen;</out></ent>文件test3.xml的內容:DTD中的實體可解析實體與不可解析實體可解析的實體是指實體的內容是能被解析器解析的數據。例如:“3.14159”

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論