XML基礎(chǔ)教程(第2版)-第3章-有效的XML文件_第1頁
XML基礎(chǔ)教程(第2版)-第3章-有效的XML文件_第2頁
XML基礎(chǔ)教程(第2版)-第3章-有效的XML文件_第3頁
XML基礎(chǔ)教程(第2版)-第3章-有效的XML文件_第4頁
XML基礎(chǔ)教程(第2版)-第3章-有效的XML文件_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

《XML基礎(chǔ)教程(第2版)》第3章有效的XML文件

本章主要內(nèi)容第3章有效的XML文件規(guī)范的XML文件和有效的XML文件

XML的核心是使用標(biāo)記組織數(shù)據(jù)之結(jié)構(gòu),以便讓信息的交互更加方便。

規(guī)范性僅僅是XML語言的基本語法,沒有對XML文件怎樣組織數(shù)據(jù)進行具體的限制。在某些系統(tǒng)中,如果不對XML怎樣組織數(shù)據(jù)進行合理的約束,那么對同一問題編寫的XML文件,在數(shù)據(jù)組織結(jié)構(gòu)上就可能有很大的不同。

例子1例子1time1.xml<?xmlversion="1.0"encoding="UTF-8"?><商店營業(yè)時間><商店><商店名稱>國貿(mào)大廈</商店名稱>

<營業(yè)時間>08:30至18:30</營業(yè)時間></商店><商店><商店名稱>華聯(lián)商場</商店名稱>

<營業(yè)時間>07:30至22:30</營業(yè)時間></商店></商店營業(yè)時間><?xmlversion="1.0"encoding="UTF-8"?><商店營業(yè)時間><商店><商店名稱>國貿(mào)大廈</商店名稱><開門時間>08:30</開門時間><關(guān)門時間>18:30</關(guān)門時間></商店><商店><商店名稱>華聯(lián)商場</商店名稱><開門時間>07:30</開門時間><關(guān)門時間>22:30</關(guān)門時間></商店></商店營業(yè)時間>例子1time2.xml§3.1有效XML文件的定義對XML組織數(shù)據(jù)進行約束的主要原因有兩個,一是讓XML的數(shù)據(jù)組織的更加合理,符合系統(tǒng)的要求,二是便于維護XML中的數(shù)據(jù),從而提高整個系統(tǒng)的可維護性。

對XML的數(shù)據(jù)結(jié)構(gòu)進行限制有兩種方式:使用文檔類型定義(DocumentTypeDefinition,DTD)和XMLSchema模式。一個規(guī)范的XML文件如果和某個DTD文件相關(guān)聯(lián),并遵守該DTD文件規(guī)定的約束條件,就稱之為有效的XML文件。

§3.1.1初識DTD

DTD文件也是有著特殊結(jié)構(gòu)的文件,簡單地說,DTD文件是由元素所構(gòu)成的文本文件。在DTD文件中,用關(guān)鍵字ELEMENT來定義一個元素,格式如下:

<!ELEMENT標(biāo)記名稱標(biāo)記的約束條件>需要一個刻畫商店營業(yè)時間的XML文件,但數(shù)據(jù)之結(jié)構(gòu)必須符合下列要求。Page28◆根標(biāo)記的名稱是“商店營業(yè)時間”?!舾鶚?biāo)記可以有若干個名稱為“商店”的子標(biāo)記?!裘Q為“商店”標(biāo)記順序地包含有名稱為“商店名稱”、“開門時間”和“關(guān)門時間”的子標(biāo)記?!裘Q為“商店名稱”的標(biāo)記包含的內(nèi)容只能是文本數(shù)據(jù),不能包含有子標(biāo)記◆名稱為“開門時間”的標(biāo)記包含的內(nèi)容只能是文本數(shù)據(jù),不能包含有子標(biāo)記?!裘Q為“關(guān)門時間”的標(biāo)記包含的內(nèi)容只能是文本數(shù)據(jù),不能包含有子標(biāo)記。DTD通過其中的元素來限制XML文件中的標(biāo)記

<!ELEMENT商店營業(yè)時間(商店*)>◆

<!ELEMENT商店(商店名稱,開門時間,關(guān)門時間)>◆

<!ELEMENT商店名稱(#PCDATA)>◆<!ELEMENT開門時間(#PCDATA)>◆<!ELEMENT關(guān)門時間(#PCDATA)>§3.1.2DTD文件的保存

DTD文件需使用文本編輯器編寫、保存。

DTD文件的擴展名必須是“.dtd”,保存時所選擇的編碼必須和其關(guān)聯(lián)的XML文件一致,比如,DTD所要約束的XML文件的編碼為UTF-8,那么DTD文件也必須按著UTF-8編碼保存。

limitShop.dtdlimitShop.dtd<!ELEMENT商店營業(yè)時間(商店*)><!ELEMENT商店(商店名稱,開門時間,關(guān)門時間)><!ELEMENT商店名稱(#PCDATA)><!ELEMENT開門時間(#PCDATA)><!ELEMENT關(guān)門時間(#PCDATA)>

§3.1.3XML文件與DTD文件相關(guān)聯(lián)

一個XML文件只有和某個DTD文件相關(guān)聯(lián),才會受到該DTD文件的約束。

在XML文件中使用“文檔類型聲明”與一個DTD文件相關(guān)聯(lián)。有兩種形式的關(guān)聯(lián):SYSTEM和PUBLIC。1.SYSTEM格式

使用SYSTEM文檔類型聲明的格式:

<DOCTYPE根標(biāo)記的名稱SYSTEM"DTD文件的URI">

<!DOCTYPE商店營業(yè)時間SYSTEM"limitShop.dtd">

和名字是“l(fā)imitShop.dtd”的DTD文件相關(guān)聯(lián)2.

PUBLIC格式

使用PUBLIC文檔類型聲明的格式:

<!DOCTYPE根標(biāo)記的名稱PUBLIC"正式公用標(biāo)識符""DTD文件的URI">

例<!DOCTYPE商店營業(yè)時間PUBLIC"-//ISO123456/Daxian/ForXML/EN""limitshop.dtd">和名字是“l(fā)imitShop.dtd”的DTD文件相關(guān)聯(lián)3.

DTD文件的位置

SYSTEM或PUBLIC格式的文檔類型聲明中提到的:"DTD文件的URI"必須是一個有效的資源,◆如果URI是一個文件的名字,該DTD文件必須和當(dāng)前XML文件在同一目錄中◆如果URI是一個URL,該URL必須是可以訪問的。例子2example3_2.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE手機用戶表SYSTEM"limitShop.dtd"><商店營業(yè)時間><商店><商店名稱>西單商場</商店名稱><開門時間>06:30</開門時間><關(guān)門時間>23:00</關(guān)門時間></商店><商店><商店名稱>海淀商廈</商店名稱><開門時間>07:30</開門時間><關(guān)門時間>18:30</關(guān)門時間></商店></商店營業(yè)時間>limitShop.dtd<!ELEMENT商店營業(yè)時間(商店*)><!ELEMENT商店(商店名稱,開門時間,關(guān)門時間)><!ELEMENT商店名稱(#PCDATA)><!ELEMENT開門時間(#PCDATA)><!ELEMENT關(guān)門時間(#PCDATA)>

§3.2如何檢查有效性當(dāng)用瀏覽器打開一個有效的XML文件時,瀏覽器的XML解析器僅僅檢查XML文件是否是規(guī)范的、檢查XML所關(guān)聯(lián)的DTD文件是否有語法錯誤,并不檢查XML文件是否遵守該DTD規(guī)定的約束條件。我們可以使用DOM解析器來檢查一個XML文件是否是有效的。簡要的說明如下:首先獲取一個DocumentBuilderFactory對象factory:

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();factory設(shè)置是否檢查XML文件的有效性:

factory.setValidating(true);factory對象調(diào)用方法newDocumentBuilder()返回DOM解析器:

DocumentBuilderdomParser=factory.newDocumentBuilder();解析器domParser調(diào)用

publicDocumentparse(Filef)throwsSAXException,IOException方法解析XML文件。例子3TestValidate.java

DTD文件使用元素(ELEMENT)來約束XML文件中的標(biāo)記,在DTD文件中使用ELEMENT定義一個元素,格式為:

<!ELEMENT標(biāo)記名稱標(biāo)記的約束條件>例如:<!ELEMENT學(xué)生(學(xué)號,姓名)>特別需要強調(diào)以下兩點:

DTD文件中的元素的作用與其在DTD文件中的書寫位置無關(guān)。

DTD文件中不允許使用多個元素約束同一個標(biāo)記。§3.3

DTD中的元素

§3.3.1約束標(biāo)記只包含有文本數(shù)據(jù)

如果準(zhǔn)備約束一個標(biāo)記沒有子標(biāo)記,也就是說只能有文本數(shù)據(jù),那么“標(biāo)記的約束條件”是用小括號括起的#PCDATA,格式如下:

<!ELEMENT標(biāo)記名稱(#PCDATA)>例如,對于

<!ELEMENT姓名(#PCDATA)>下列3個名稱是“姓名”的標(biāo)記都是符合約束條件的標(biāo)記:<姓名>張三</姓名><姓名></姓名><姓名/>而<姓名>李逵<sex>男</sex></姓名>是不符合約束條件的標(biāo)記§3.3.2約束標(biāo)記的子標(biāo)記_1元素的格式

若要約束XML文件中某個標(biāo)記可以有怎樣的子標(biāo)記,那么DTD中元素<!ELEMENT標(biāo)記名稱

標(biāo)記的約束條件

>聲明的“標(biāo)記的約束條件”是用小括號括起的子標(biāo)記列表,格式為

<!ELEMENT標(biāo)記名稱(子標(biāo)記列表)>注:“子標(biāo)記列表”中用逗號分隔列出的若干個標(biāo)記是有先后順序的“開學(xué)時間”標(biāo)記是不符合約束的標(biāo)記

×<開學(xué)時間>清華大學(xué)<year>2010</year><month>09</month><day>01</day></開學(xué)時間>“開學(xué)時間”標(biāo)記是符合約束的標(biāo)記

√<開學(xué)時間><year>2010</year><month>09</month><day>01</day></開學(xué)時間>“開學(xué)時間”標(biāo)記是不符合約束的標(biāo)記

×<month>09</month><year>2010<year><day>01</day>§3.3.2約束標(biāo)記的子標(biāo)記_2模式限定符的使用

1元素格式<!ELEMENT標(biāo)記名稱(子標(biāo)記列表)>中的“子標(biāo)記列表”的每個標(biāo)記的后面可以尾加模式限定符號來限定該子標(biāo)記出現(xiàn)的次數(shù)。不尾加限定符號的子標(biāo)記必須出現(xiàn)且只能出現(xiàn)一次。限定符號有:+:尾加該限定符號的子標(biāo)記必須出現(xiàn)一次或多次。*:尾加該限定符號的子標(biāo)記可出現(xiàn)零次或多次。?:尾加該限定符號的子標(biāo)記可出現(xiàn)零次或一次。例如:<!ELEMENT庫存商品(商品名稱+,管理員?)>2“子標(biāo)記列表”中的子標(biāo)記也可以是幾個標(biāo)記的“或運算”,而且“或運算”必須用小括號擴起,例如,元素:<!ELEMENT應(yīng)聘者(姓名,(本科|碩士|博士),性別)><!ELEMENT學(xué)生(姓名,(獎勵|處分)*,性別)>

例子4example3_4.xmlfourDTD.dtd<!ELEMENT應(yīng)聘信息(應(yīng)聘者*)><!ELEMENT應(yīng)聘者(姓名,(本科|碩士|博士),(獎勵|處分)*,(性別))><!ELEMENT姓名(#PCDATA)><!ELEMENT本科(#PCDATA)><!ELEMENT碩士(#PCDATA)><!ELEMENT博士(#PCDATA)><!ELEMENT獎勵(#PCDATA)><!ELEMENT處分(#PCDATA)><!ELEMENT性別(#PCDATA)>§3.3.3約束標(biāo)記的混合內(nèi)容

一個標(biāo)記的內(nèi)容可以有兩部分構(gòu)成文本數(shù)據(jù)和標(biāo)記,其中的標(biāo)記稱做該標(biāo)記的子標(biāo)記.上面我們已經(jīng)知道怎樣使用DTD約束標(biāo)記的子標(biāo)記,比如<!ELEMENT開學(xué)時間(year,month.day)>約束“開學(xué)時間”恰好包含有3個子標(biāo)記year、month和day,不可以包含有能顯示的文本數(shù)據(jù)。如果允許標(biāo)記的內(nèi)容即可以有可顯示的文本數(shù)據(jù),也可以有子標(biāo)記,那么在DTD文件中,元素的“標(biāo)記的約束條件”是關(guān)鍵字“#PCDATA”和若干個子標(biāo)記的“或運算”,而且該“或運算”必須用小括號括起并尾加一個“*”號,格式如下:

<!ELEMENT標(biāo)記名稱(#PCDATA|子標(biāo)記1|子標(biāo)記2…|子標(biāo)記m)*>注:幾種常見的錯誤寫法,及錯誤的原因見page37例子5example3_5.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE學(xué)生列表PUBLIC"-//ISO88//school//ForXML/Ch""fiveDTD.dtd"><學(xué)生列表><姓名>張三<出生日期>1993-12-12</出生日期><性別>男</性別></姓名><姓名>孫翠花<出生日期>1992-01-31</出生日期><性別>女</性別></姓名></學(xué)生列表><!ELEMENT學(xué)生列表(姓名*)><!ELEMENT姓名(#PCDATA|出生日期|性別)*><!ELEMENT出生日期(#PCDATA)><!ELEMENT性別(#PCDATA)>fiveDTD.dtd§3.3.4EMPTY和ANY

如果準(zhǔn)備約束一個標(biāo)記是空標(biāo)記,或者是只含有空字符的非空標(biāo)記,元素的“標(biāo)記的約束條件”可以是關(guān)鍵字“EMPTY”;如果不準(zhǔn)備對一個標(biāo)記有任何約束,元素的“標(biāo)記的約束條件”可以是關(guān)鍵字“ANY”。對于元素:<!ELEMENTspeakEMPTY>下列2個標(biāo)記都是符合約束條件的標(biāo)記:<speak/><speak></speak>對于元素:<!ELEMENThelloANY>下列2標(biāo)記是符合約束條件的標(biāo)記:<hello>howareyou</hello><hello><english>howareyou</english><chinese>你好</chinese></hello>§3.4DTD的完整性

(1)不允許無窮嵌套如果一個DTD元素約束某個標(biāo)記可以出現(xiàn)某個子標(biāo)記,那么對該子標(biāo)記進行約束的DTD元素就不能約束該標(biāo)記的子標(biāo)記是它的父標(biāo)記。DTD文件中同時出現(xiàn)下列兩個元素是不允許的。<!ELEMENT學(xué)生(姓名,性別)><!ELEMENT姓名(學(xué)生,拼音)>(2)XML文件中的每個標(biāo)記都必須在DTD中有相應(yīng)元素進行約束。

nocomplete.dtd是不完整的

×

<!ELEMENT商店營業(yè)時間(商店*)><!ELEMENT商店(商店名稱,開門時間,關(guān)門時間)><!ELEMENT商店名稱(#PCDATA)>§3.5

DTD中的屬性約束列表

XML文件中的標(biāo)記可以附帶屬性,標(biāo)記附帶屬性的目的是為該標(biāo)記添加附加信息。標(biāo)記的屬性是一個“名-值”對,即屬性必須由名字和值組成。屬性必須在非空標(biāo)記的開始標(biāo)簽或空標(biāo)記中聲明,用“=”為屬性指定一個值。例如,下列名字為“長方體”的空標(biāo)記有三個屬性:

<長方體length="1000"width="300"height="600"/>§3.5.1ATTLIST屬性約束列表_1

DTD文件中可以使用元素約束XML文件中的標(biāo)記。同樣,可以通過在DTD文件中定義屬性約束列表來約束XML文件中的標(biāo)記的屬性。

DTD使用關(guān)鍵字ATTLIST定義一個屬性約束列表來約束XML文件中標(biāo)記的屬性,在DTD中定義屬性約束列表的格式為:<!ATTLIST標(biāo)記名稱屬性名稱屬性類型默認(rèn)值情況屬性名稱屬性類型默認(rèn)值情況…….>ATTLIST屬性約束列表1<!ATTLIST教室

widthCDATA"0"lengthCDATA"0">ATTLIST屬性約束列表2<!ATTLIST姓名性別CDATA"男"><!ELEMENT教學(xué)樓(教室*)><!ELEMENT教室(號碼,用途)><!ELEMENT號碼(#PCDATA)><!ELEMENT用途(#PCDATA)><!ATTLIST教室widthCDATA"8m"><!ATTLIST教室lengthCDATA"15m">例子6example3_6.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE教學(xué)樓SYSTEM"sixDTD.dtd"><教學(xué)樓><教室><號碼>A101</號碼><用途>自習(xí)室</用途></教室><教室width="10m"length="16m"><號碼>A606</號碼><用途>語音室</用途></教室></教學(xué)樓>sixDTD.dtd圖3.4使用ATTLIST屬性約束列表約束屬性§3.5.1ATTLIST屬性約束列表_2

1.屬性名稱屬性名稱可以由字母、數(shù)字、下劃線(“_”)、點(“.”)或連字符(“-”)組成,但必須以字母或下劃線開頭,屬性的名稱區(qū)分大小寫。2.屬性類型屬性值一定是一個字符串,那么屬性類型就決定了屬性可以用怎樣的字符串作為它的值。注:屬性值中都不能含有含有左尖括號“<”、右尖括號“>”、與符號“&”、單引號“'”和雙引號“"”,如果想使用這些字符,可以使用實體引用。要特別注意的是,屬性值區(qū)分大小寫。3.默認(rèn)值情況

ATTLIST定義的屬性約束列表是為了約束XML文件中標(biāo)記的屬性,ATTLIST屬性約束列表:<!ATTLIST標(biāo)記名稱屬性名稱屬性類型默認(rèn)值情況>中的“默認(rèn)值情況”是對標(biāo)記的屬性進行約束的細(xì)節(jié)條件。§3.5.2屬性的默認(rèn)值

ATTLIST屬性約束列表<!ATTLIST標(biāo)記名稱屬性名稱屬性類型默認(rèn)值情況>其中的“默認(rèn)值情況”含有約束的細(xì)節(jié)條件。“默認(rèn)值情況”可以是下列三種情形:●“默認(rèn)值情況”是字符串,例如:<!ATTLIST桌子colorCDATA"red">

“默認(rèn)值情況”是字符串"red"?!瘛澳J(rèn)值情況”是#IMPLIED或#REQUIRE,例如:<!ATTLIST汽車車牌CDATA#REQUIRED>

“默認(rèn)值情況”是#REQUIRED。●“默認(rèn)值情況”是#FIXED"字符串"。例如:<!ATTLIST火警電話號碼CDATA#FIXED"119">

“默認(rèn)值情況”是#FIXED"119"?!澳J(rèn)值情況”對標(biāo)記的屬性給予約束的意義如表3.1。表3.1默認(rèn)值情況的約束意義

§3.5.2屬性的默認(rèn)值_1“默認(rèn)值情況”是字符串

“默認(rèn)值情況”是字符串,例如:<!ATTLIST桌子colorCDATA"red">

“默認(rèn)值情況”是字符串"red"。◆在編寫XML中時,可以顯示地為被約束的標(biāo)記附加該屬性,并且可以重新指定該屬性的值?!艟帉慩ML文件時,也允許被約束的標(biāo)記不顯示地附加該屬性,在這種情況下,解析器認(rèn)為該標(biāo)記有這個屬性,并且默認(rèn)值為ATTLIST屬性約束列表中“默認(rèn)值情況”給定的字符串。<!ELEMENT商品列表(商品*)><!ELEMENT商品(名稱,價格)><!ELEMENT名稱(#PCDATA)><!ELEMENT價格(#PCDATA)><!ATTLIST商品類別CDATA"食品">例子7example3_7.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE商品列表SYSTEM"sevenDTD.dtd"><商品列表><商品類別="家電"><名稱>電視機</名稱><價格>2678元/臺</價格></商品><商品><!--沒有顯示地附加“類別”屬性--><名稱>東北大米</名稱><價格>5.9元/千克</價格></商品></商品列表>sevenDTD.dtd§3.5.2屬性的默認(rèn)值_2默認(rèn)值情況”是#IMPLIED

在ATTLIST屬性約束列表中可以設(shè)置屬性的“默認(rèn)值情況”是#IMPLIED。例如:<!ATTLIST桌子color#IMPLIED>這時,該屬性就沒有默認(rèn)值,而且被約束的標(biāo)記可以不附加該屬性。當(dāng)認(rèn)為一個屬性對于標(biāo)記可有可無、且沒有默認(rèn)值時,就可以將屬性的“默認(rèn)值情況”設(shè)置為#IMPLIED。§3.5.2屬性的默認(rèn)值_3#REQUIRED

在ATTLIST屬性約束列表中可以設(shè)置屬性的“默認(rèn)值情況”是#REQUIRED,例如:<!ATTLIST桌子length#REQUIRED桌子width#REQUIRED桌子height#REQUIRED>這時,該屬性沒有默認(rèn)值,被約束的標(biāo)記必須要附加該屬性并給出屬性的值。當(dāng)不想為某個屬性設(shè)置默認(rèn)值,但要求標(biāo)記必須附加該屬性時,就可以將屬性的“默認(rèn)值情況”設(shè)置為#REQUIRED。§3.5.2屬性的默認(rèn)值_4#FIXED

ATTLIST屬性約束列表中可以設(shè)置屬性的“默認(rèn)值情況”是:

#FIXED"字符串"例如:

<!ATTLIST報警電話號碼CDATA#FIXED"110">

這時,該屬性的默認(rèn)值就是關(guān)鍵字#FIXED后面指定的那個字符串。在編寫XML文件時,即使被約束的標(biāo)記不顯示地附加該屬性,解析器也認(rèn)為該標(biāo)記有這個屬性,而且屬性值是#FIXED后面指定的那個字符串。但是,在編寫XML文件時,如果被約束的標(biāo)記顯示地附加該屬性,那么不可以改變屬性的值,即該屬性的值必須是#FIXED后面指定的那個字符串。當(dāng)準(zhǔn)備約束標(biāo)記的某個屬性的值是固定不變的一個值,就可以將屬性的“默認(rèn)值情況”設(shè)置為:#FIXED"字符串"

<!ELEMENT教學(xué)樓(教室*,休息室*)><!ELEMENT教室(#PCDATA)><!ELEMENT休息室(#PCDATA)><!ATTLIST教室號碼CDATA#REQUIRED><!ATTLIST休息室號碼CDATA#IMPLIED>例子8example3_8.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE教學(xué)樓SYSTEM"eightDTD.dtd"><教學(xué)樓><教室號碼="2109">物理系專用</教室><教室號碼="5509">英語系專用</教室><休息室號碼="T5">老師課間休息專用</休息室><休息室>學(xué)生課間休息專用</休息室></教學(xué)樓>eightDTD.dtd圖3.6默認(rèn)值情況為#REQUIRED和#IMPLIED<!ELEMENT重要電話薄(報警電話,火警電話,急救電話)><!ELEMENT報警電話(#PCDATA)><!ELEMENT火警電話(#PCDATA)><!ELEMENT急救電話(#PCDATA)><!ATTLIST報警電話號碼CDATA#FIXED"110"><!ATTLIST火警電話號碼CDATA#FIXED"119"><!ATTLIST急救電話號碼CDATA#FIXED"120">例子9example3_9.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE重要電話薄

SYSTEM"ten.dtd"><重要電話薄><報警電話

號碼="110">不要亂打報警電話。</報警電話><火警電話>一旦發(fā)生火災(zāi),請及時撥打火警電話。</火警電話><急救電話>救死扶傷</急救電話></重要電話薄>

nineDTD.dtd圖3.7默認(rèn)值情況為#FIXED圖3.8使用解析器檢查出的錯誤§3.5.3屬性類型

屬性類型決定了屬性可以用怎樣的字符串作為屬性的值。屬性的常用類型有:

CDATA、Enumerated、NMTOKEN、NMTOKENS、ID、IDREF、IDREFS?!?.5.3屬性類型_1CDATA類型

1.CDATA類型對于CDATA(CharacterData)類型的屬性,該屬性的值可以是任何一個字符串,但是,字符串中不能含有含有左尖括號、右尖括號、與符號、單引號和雙引號,如果想使用這些字符,可以使用實體引用。例題3-10page47<!ELEMENT通訊錄(姓名*)><!ELEMENT姓名(#PCDATA)><!ATTLIST姓名電話CDATA#REQUIREDemailCDATA#REQUIRED

住址CDATA#IMPLIED>例子10example3_10.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE通訊錄SYSTEM"tenDTD.dtd"><通訊錄><姓名電話="12345678"email="zhangfei@">張飛</姓名><姓名電話="98765432"email="likui@"住址="大連老鱉灣">李逵</姓名></通訊錄>tenDTD.dtd§3.5.3屬性類型_2.Enumerated類型

2.Enumerated類型如果屬性的類型是Enumerated類型,那么該屬性只可以是枚舉值。在ATTLIST屬性約束列表中使用Enumerated類型的格式如下:

<!ATTLIST標(biāo)記名稱屬性名稱(屬性值1|屬性值2|…|屬性值n)默認(rèn)值情況>

例題3-11page48<!ELEMENT道路(路燈*)><!ELEMENT路燈(編號,位置)><!ELEMENT編號(#PCDATA)><!ELEMENT位置(#PCDATA)><!ATTLIST路燈狀態(tài)(亮|滅)#REQUIRED>例子11example3_11.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE道路SYSTEM"elevenDTD.dtd"><道路><路燈狀態(tài)="亮"><編號>10010</編號><位置>中山路</位置></路燈><路燈狀態(tài)="滅"><編號>20011</編號><位置>長江路</位置></路燈></道路>

elevenDTD.dtd§3.5.3屬性類型_3.NMTOKEN類型

3.NMTOKEN類型

如果屬性的類型是NMTOKEN類型的屬性,屬性值可以由字母、數(shù)字、下劃線(“_”)、點(“.”)或連字符(“-”)組成,屬性值中不能含有空格字符(屬性值也可以用數(shù)字、點或連字符開頭)。例題3-11page49!ELEMENT作家名單(姓名*)><!ELEMENT姓名(#PCDATA)><!ATTLIST姓名筆名NMTOKEN#IMPLIED>例子12example3_12.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE作家名單SYSTEM"twelveDTD.dtd"><作家名單><姓名筆名="仙山">張三</姓名><姓名筆名="桃李">李陶</姓名></作家名單>twelveDTD.dtd§3.5.3屬性類型_4.NMTOKENS類型

4.NMTOKENS類型

對于NMTOKEN類型的屬性,其屬性值中不能含有空格。如果需要某個屬性的屬性值含有空格,而且被空格分隔開的子字符串符合NMTOKEN類型屬性的屬性值之規(guī)定,那么就可以將屬性的類型取為NMTOKENS類型.例題3-14page50<!ELEMENT圖書列表(圖書*)><!ELEMENT圖書(名稱,出版社)><!ELEMENT名稱(#PCDATA)><!ELEMENT出版社(#PCDATA)><!ATTLIST圖書關(guān)鍵字NMTOKENS#REQUIRED>例子13example3_13.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE圖書列表SYSTEM"thirteenDTD.dtd"><圖書列表><圖書關(guān)鍵字="XML可擴展語言解析器"><名稱>XM基礎(chǔ)教程</名稱><出版社>清華大學(xué)出版社</出版社></圖書><圖書關(guān)鍵字="Java類對象線程"><名稱>Java程序設(shè)計</名稱><出版社>清華大學(xué)出版社</出版社></圖書></圖書列表>thirteenDTD.dtd§3.5.3屬性類型_5.ID類型

5.ID類型如果希望某個屬性的屬性值具有專用性,即不允許其它類型相同的屬性再取這個屬性值,那么就可以將屬性的類型取為ID類型。注意①ID類型的屬性值可以由字母、數(shù)字、下劃線(“_”)、點(“.”)或連字符(“-”)組成,但必須以字母或下劃線開頭。②需要特別注意的是ID類型屬性的“默認(rèn)值情況”只能是“#REQUIRED”和“IMPLIED”

例題3-14page51“默認(rèn)值情況”是錯誤的×<!ATTLIST汪想地址IDFIXED"北京市"><!ATTLIST辛望地址ID"清華大學(xué)">默認(rèn)值情況”是正確的√<!ATTLIST汪想地址ID#REQUIRED><!ATTLIST辛望地址ID#IMPLIED"><!ELEMENT城市交通(公交電車,公交汽車)><!ELEMENT公交汽車(名稱*)><!ELEMENT公交電車(名稱*)><!ELEMENT名稱(#PCDATA)><!ATTLIST名稱車牌號ID#REQUIRED>例子14example3_14.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE城市交通SYSTEM"fourteenDTD.dtd"><城市交通><公交電車><名稱車牌號="遼B555">101無軌電車</名稱><名稱車牌號="遼B888">201有軌電車</名稱></公交電車><公交汽車><名稱車牌號="遼B666">801快車</名稱><名稱車牌號="遼B777">631普通</名稱></公交汽車></城市交通>fourteenDTD.dtd圖3.11使用解析器檢查出的錯誤§3.5.3屬性類型_6.IDREF類型

6.IDREF類型

如果準(zhǔn)備通過標(biāo)記的屬性值來判斷標(biāo)記之間的聯(lián)系,就可以在標(biāo)記中使用IDREF(IdentifierReference)類型的屬性。IDREF類型屬性的屬性值只能取某個標(biāo)記中ID類型屬性的屬性值。例題3-15page52<!ELEMENT簡歷列表(專科,本科,碩士,博士,姓名*)><!ELEMENT??艵MPTY><!ELEMENT本科EMPTY><!ELEMENT碩士EMPTY><!ELEMENT博士EMPTY><!ELEMENT姓名(#PCDATA)><!ATTLIST??苙umberCodeID#REQUIRED><!ATTLIST本科numberCodeID#REQUIRED><!ATTLIST碩士numberCodeID#REQUIRED><!ATTLIST博士numberCodeID#REQUIRED><!ATTLIST姓名學(xué)歷IDREF#REQUIRED>例子15example3_15.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE簡歷列表SYSTEM"fifteenDTD.dtd"><簡歷列表><??苙umberCode="A101"/><本科numberCode="B102"/><碩士numberCode="C201"/><博士numberCode="D202"/><姓名學(xué)歷="A101">張三</姓名><姓名學(xué)歷="D202">李四</姓名><姓名學(xué)歷="B102">趙五</姓名><姓名學(xué)歷="C201">孫六</姓名></簡歷列表>fifteenDTD.dtd

§

溫馨提示

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

最新文檔

評論

0/150

提交評論