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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

§3.1.1初識(shí)DTD

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

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

<!ELEMENT商店?duì)I業(yè)時(shí)間(商店*)>◆

<!ELEMENT商店(商店名稱,開(kāi)門(mén)時(shí)間,關(guān)門(mén)時(shí)間)>◆

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

DTD文件需使用文本編輯器編寫(xiě)、保存。

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

limitShop.dtdlimitShop.dtd<!ELEMENT商店?duì)I業(yè)時(shí)間(商店*)><!ELEMENT商店(商店名稱,開(kāi)門(mén)時(shí)間,關(guān)門(mén)時(shí)間)><!ELEMENT商店名稱(#PCDATA)><!ELEMENT開(kāi)門(mén)時(shí)間(#PCDATA)><!ELEMENT關(guān)門(mén)時(shí)間(#PCDATA)>

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

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

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

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

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

<!DOCTYPE商店?duì)I業(yè)時(shí)間SYSTEM"limitShop.dtd">

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

PUBLIC格式

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

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

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

DTD文件的位置

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

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

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

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

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

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

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

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

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

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

DTD中的元素

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

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

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

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

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

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

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

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

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

√<開(kāi)學(xué)時(shí)間><year>2010</year><month>09</month><day>01</day></開(kāi)學(xué)時(shí)間>“開(kāi)學(xué)時(shí)間”標(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)記列表”的每個(gè)標(biāo)記的后面可以尾加模式限定符號(hào)來(lái)限定該子標(biāo)記出現(xiàn)的次數(shù)。不尾加限定符號(hào)的子標(biāo)記必須出現(xiàn)且只能出現(xiàn)一次。限定符號(hào)有:+:尾加該限定符號(hào)的子標(biāo)記必須出現(xiàn)一次或多次。*:尾加該限定符號(hào)的子標(biāo)記可出現(xiàn)零次或多次。?:尾加該限定符號(hào)的子標(biāo)記可出現(xiàn)零次或一次。例如:<!ELEMENT庫(kù)存商品(商品名稱+,管理員?)>2“子標(biāo)記列表”中的子標(biāo)記也可以是幾個(gè)標(biāo)記的“或運(yùn)算”,而且“或運(yùn)算”必須用小括號(hào)擴(kuò)起,例如,元素:<!ELEMENT應(yīng)聘者(姓名,(本科|碩士|博士),性別)><!ELEMENT學(xué)生(姓名,(獎(jiǎng)勵(lì)|處分)*,性別)>

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

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

<!ELEMENT標(biāo)記名稱(#PCDATA|子標(biāo)記1|子標(biāo)記2…|子標(biāo)記m)*>注:幾種常見(jiàn)的錯(cuò)誤寫(xiě)法,及錯(cuò)誤的原因見(jiàn)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)備約束一個(gè)標(biāo)記是空標(biāo)記,或者是只含有空字符的非空標(biāo)記,元素的“標(biāo)記的約束條件”可以是關(guān)鍵字“EMPTY”;如果不準(zhǔn)備對(duì)一個(gè)標(biāo)記有任何約束,元素的“標(biāo)記的約束條件”可以是關(guān)鍵字“ANY”。對(duì)于元素:<!ELEMENTspeakEMPTY>下列2個(gè)標(biāo)記都是符合約束條件的標(biāo)記:<speak/><speak></speak>對(duì)于元素:<!ELEMENThelloANY>下列2標(biāo)記是符合約束條件的標(biāo)記:<hello>howareyou</hello><hello><english>howareyou</english><chinese>你好</chinese></hello>§3.4DTD的完整性

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

nocomplete.dtd是不完整的

×

<!ELEMENT商店?duì)I業(yè)時(shí)間(商店*)><!ELEMENT商店(商店名稱,開(kāi)門(mén)時(shí)間,關(guān)門(mén)時(shí)間)><!ELEMENT商店名稱(#PCDATA)>§3.5

DTD中的屬性約束列表

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

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

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

DTD使用關(guān)鍵字ATTLIST定義一個(gè)屬性約束列表來(lái)約束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教室(號(hào)碼,用途)><!ELEMENT號(hào)碼(#PCDATA)><!ELEMENT用途(#PCDATA)><!ATTLIST教室widthCDATA"8m"><!ATTLIST教室lengthCDATA"15m">例子6example3_6.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE教學(xué)樓SYSTEM"sixDTD.dtd"><教學(xué)樓><教室><號(hào)碼>A101</號(hào)碼><用途>自習(xí)室</用途></教室><教室width="10m"length="16m"><號(hào)碼>A606</號(hào)碼><用途>語(yǔ)音室</用途></教室></教學(xué)樓>sixDTD.dtd圖3.4使用ATTLIST屬性約束列表約束屬性§3.5.1ATTLIST屬性約束列表_2

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

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

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

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

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

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

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

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

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

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

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

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

#FIXED"字符串"例如:

<!ATTLIST報(bào)警電話號(hào)碼CDATA#FIXED"110">

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

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

SYSTEM"ten.dtd"><重要電話薄><報(bào)警電話

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

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

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

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

1.CDATA類型對(duì)于CDATA(CharacterData)類型的屬性,該屬性的值可以是任何一個(gè)字符串,但是,字符串中不能含有含有左尖括號(hào)、右尖括號(hào)、與符號(hào)、單引號(hào)和雙引號(hào),如果想使用這些字符,可以使用實(shí)體引用。例題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路燈(編號(hào),位置)><!ELEMENT編號(hào)(#PCDATA)><!ELEMENT位置(#PCDATA)><!ATTLIST路燈狀態(tài)(亮|滅)#REQUIRED>例子11example3_11.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE道路SYSTEM"elevenDTD.dtd"><道路><路燈狀態(tài)="亮"><編號(hào)>10010</編號(hào)><位置>中山路</位置></路燈><路燈狀態(tài)="滅"><編號(hào)>20011</編號(hào)><位置>長(zhǎng)江路</位置></路燈></道路>

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

3.NMTOKEN類型

如果屬性的類型是NMTOKEN類型的屬性,屬性值可以由字母、數(shù)字、下劃線(“_”)、點(diǎn)(“.”)或連字符(“-”)組成,屬性值中不能含有空格字符(屬性值也可以用數(shù)字、點(diǎn)或連字符開(kāi)頭)。例題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類型

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

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

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

6.IDREF類型

如果準(zhǔn)備通過(guò)標(biāo)記的屬性值來(lái)判斷標(biāo)記之間的聯(lián)系,就可以在標(biāo)記中使用IDREF(IdentifierReference)類型的屬性。IDREF類型屬性的屬性值只能取某個(gè)標(biāo)記中ID類型屬性的屬性值。例題3-15page52<!ELEMENT簡(jiǎn)歷列表(???本科,碩士,博士,姓名*)><!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簡(jiǎn)歷列表SYSTEM"fifteenDTD.dtd"><簡(jiǎn)歷列表><??苙umberCode="A101"/><本科numberCode="B102"/><碩士numberCode="C201"/><博士numberCode="D202"/><姓名學(xué)歷="A101">張三</姓名><姓名學(xué)歷="D202">李四</姓名><姓名學(xué)歷="B102">趙五</姓名><姓名學(xué)歷="C201">孫六</姓名></簡(jiǎn)歷列表>fifteenDTD.dtd

§

溫馨提示

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

評(píng)論

0/150

提交評(píng)論