版權(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ī)范性?xún)H僅是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í)間><商店><商店名稱(chēng)>國(guó)貿(mào)大廈</商店名稱(chēng)>
<營(yíng)業(yè)時(shí)間>08:30至18:30</營(yíng)業(yè)時(shí)間></商店><商店><商店名稱(chēng)>華聯(lián)商場(chǎng)</商店名稱(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í)間><商店><商店名稱(chēng)>國(guó)貿(mào)大廈</商店名稱(chēng)><開(kāi)門(mén)時(shí)間>08:30</開(kāi)門(mén)時(shí)間><關(guān)門(mén)時(shí)間>18:30</關(guān)門(mén)時(shí)間></商店><商店><商店名稱(chēng)>華聯(lián)商場(chǎng)</商店名稱(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)行限制有兩種方式:使用文檔類(lèi)型定義(DocumentTypeDefinition,DTD)和XMLSchema模式。一個(gè)規(guī)范的XML文件如果和某個(gè)DTD文件相關(guān)聯(lián),并遵守該DTD文件規(guī)定的約束條件,就稱(chēng)之為有效的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)記名稱(chēng)標(biāo)記的約束條件>需要一個(gè)刻畫(huà)商店?duì)I業(yè)時(shí)間的XML文件,但數(shù)據(jù)之結(jié)構(gòu)必須符合下列要求。Page28◆根標(biāo)記的名稱(chēng)是“商店?duì)I業(yè)時(shí)間”?!舾鶚?biāo)記可以有若干個(gè)名稱(chēng)為“商店”的子標(biāo)記?!裘Q(chēng)為“商店”標(biāo)記順序地包含有名稱(chēng)為“商店名稱(chēng)”、“開(kāi)門(mén)時(shí)間”和“關(guān)門(mén)時(shí)間”的子標(biāo)記。◆名稱(chēng)為“商店名稱(chēng)”的標(biāo)記包含的內(nèi)容只能是文本數(shù)據(jù),不能包含有子標(biāo)記◆名稱(chēng)為“開(kāi)門(mén)時(shí)間”的標(biāo)記包含的內(nèi)容只能是文本數(shù)據(jù),不能包含有子標(biāo)記。◆名稱(chēng)為“關(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商店(商店名稱(chēng),開(kāi)門(mén)時(shí)間,關(guān)門(mén)時(shí)間)>◆
<!ELEMENT商店名稱(chēng)(#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商店(商店名稱(chēng),開(kāi)門(mén)時(shí)間,關(guān)門(mén)時(shí)間)><!ELEMENT商店名稱(chēng)(#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文件中使用“文檔類(lèi)型聲明”與一個(gè)DTD文件相關(guān)聯(lián)。有兩種形式的關(guān)聯(lián):SYSTEM和PUBLIC。1.SYSTEM格式
使用SYSTEM文檔類(lèi)型聲明的格式:
<DOCTYPE根標(biāo)記的名稱(chēng)SYSTEM"DTD文件的URI">
例
<!DOCTYPE商店?duì)I業(yè)時(shí)間SYSTEM"limitShop.dtd">
和名字是“l(fā)imitShop.dtd”的DTD文件相關(guān)聯(lián)2.
PUBLIC格式
使用PUBLIC文檔類(lèi)型聲明的格式:
<!DOCTYPE根標(biāo)記的名稱(chēng)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格式的文檔類(lèi)型聲明中提到的:"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)>西單商場(chǎng)</商店名稱(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í)間></商店><商店><商店名稱(chēng)>海淀商廈</商店名稱(chēng)><開(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商店(商店名稱(chēng),開(kāi)門(mén)時(shí)間,關(guān)門(mén)時(shí)間)><!ELEMENT商店名稱(chēng)(#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)記名稱(chēng)標(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)記名稱(chēng)(#PCDATA)>例如,對(duì)于
<!ELEMENT姓名(#PCDATA)>下列3個(gè)名稱(chēng)是“姓名”的標(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)記名稱(chēng)
標(biāo)記的約束條件
>聲明的“標(biāo)記的約束條件”是用小括號(hào)括起的子標(biāo)記列表,格式為
<!ELEMENT標(biāo)記名稱(chēng)(子標(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)記名稱(chēng)(子標(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ù)存商品(商品名稱(chēng)+,管理員?)>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)記稱(chēng)做該標(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)記名稱(chēng)(#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商店(商店名稱(chēng),開(kāi)門(mén)時(shí)間,關(guān)門(mén)時(shí)間)><!ELEMENT商店名稱(chēng)(#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)記名稱(chēng)屬性名稱(chēng)屬性類(lèi)型默認(rèn)值情況屬性名稱(chēng)屬性類(lèi)型默認(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.屬性名稱(chēng)屬性名稱(chēng)可以由字母、數(shù)字、下劃線(“_”)、點(diǎn)(“.”)或連字符(“-”)組成,但必須以字母或下劃線開(kāi)頭,屬性的名稱(chēng)區(qū)分大小寫(xiě)。2.屬性類(lèi)型屬性值一定是一個(gè)字符串,那么屬性類(lèi)型就決定了屬性可以用怎樣的字符串作為它的值。注:屬性值中都不能含有含有左尖括號(hào)“<”、右尖括號(hào)“>”、與符號(hào)“&”、單引號(hào)“'”和雙引號(hào)“"”,如果想使用這些字符,可以使用實(shí)體引用。要特別注意的是,屬性值區(qū)分大小寫(xiě)。3.默認(rèn)值情況
ATTLIST定義的屬性約束列表是為了約束XML文件中標(biāo)記的屬性,ATTLIST屬性約束列表:<!ATTLIST標(biāo)記名稱(chēng)屬性名稱(chēng)屬性類(lèi)型默認(rèn)值情況>中的“默認(rèn)值情況”是對(duì)標(biāo)記的屬性進(jìn)行約束的細(xì)節(jié)條件?!?.5.2屬性的默認(rèn)值
ATTLIST屬性約束列表<!ATTLIST標(biāo)記名稱(chēng)屬性名稱(chēng)屬性類(lèi)型默認(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"?!澳J(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商品(名稱(chēng),價(jià)格)><!ELEMENT名稱(chēng)(#PCDATA)><!ELEMENT價(jià)格(#PCDATA)><!ATTLIST商品類(lèi)別CDATA"食品">例子7example3_7.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE商品列表SYSTEM"sevenDTD.dtd"><商品列表><商品類(lèi)別="家電"><名稱(chēng)>電視機(jī)</名稱(chēng)><價(jià)格>2678元/臺(tái)</價(jià)格></商品><商品><!--沒(méi)有顯示地附加“類(lèi)別”屬性--><名稱(chēng)>東北大米</名稱(chēng)><價(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。§3.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">物理系專(zhuān)用</教室><教室號(hào)碼="5509">英語(yǔ)系專(zhuān)用</教室><休息室號(hào)碼="T5">老師課間休息專(zhuān)用</休息室><休息室>學(xué)生課間休息專(zhuān)用</休息室></教學(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屬性類(lèi)型
屬性類(lèi)型決定了屬性可以用怎樣的字符串作為屬性的值。屬性的常用類(lèi)型有:
CDATA、Enumerated、NMTOKEN、NMTOKENS、ID、IDREF、IDREFS?!?.5.3屬性類(lèi)型_1CDATA類(lèi)型
1.CDATA類(lèi)型對(duì)于CDATA(CharacterData)類(lèi)型的屬性,該屬性的值可以是任何一個(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屬性類(lèi)型_2.Enumerated類(lèi)型
2.Enumerated類(lèi)型如果屬性的類(lèi)型是Enumerated類(lèi)型,那么該屬性只可以是枚舉值。在ATTLIST屬性約束列表中使用Enumerated類(lèi)型的格式如下:
<!ATTLIST標(biāo)記名稱(chēng)屬性名稱(chēng)(屬性值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屬性類(lèi)型_3.NMTOKEN類(lèi)型
3.NMTOKEN類(lèi)型
如果屬性的類(lèi)型是NMTOKEN類(lèi)型的屬性,屬性值可以由字母、數(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屬性類(lèi)型_4.NMTOKENS類(lèi)型
4.NMTOKENS類(lèi)型
對(duì)于NMTOKEN類(lèi)型的屬性,其屬性值中不能含有空格。如果需要某個(gè)屬性的屬性值含有空格,而且被空格分隔開(kāi)的子字符串符合NMTOKEN類(lèi)型屬性的屬性值之規(guī)定,那么就可以將屬性的類(lèi)型取為NMTOKENS類(lèi)型.例題3-14page50<!ELEMENT圖書(shū)列表(圖書(shū)*)><!ELEMENT圖書(shū)(名稱(chēng),出版社)><!ELEMENT名稱(chēng)(#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ǔ)言解析器"><名稱(chēng)>XM基礎(chǔ)教程</名稱(chēng)><出版社>清華大學(xué)出版社</出版社></圖書(shū)><圖書(shū)關(guān)鍵字="Java類(lèi)對(duì)象線程"><名稱(chēng)>Java程序設(shè)計(jì)</名稱(chēng)><出版社>清華大學(xué)出版社</出版社></圖書(shū)></圖書(shū)列表>thirteenDTD.dtd§3.5.3屬性類(lèi)型_5.ID類(lèi)型
5.ID類(lèi)型如果希望某個(gè)屬性的屬性值具有專(zhuān)用性,即不允許其它類(lèi)型相同的屬性再取這個(gè)屬性值,那么就可以將屬性的類(lèi)型取為ID類(lèi)型。注意①I(mǎi)D類(lèi)型的屬性值可以由字母、數(shù)字、下劃線(“_”)、點(diǎn)(“.”)或連字符(“-”)組成,但必須以字母或下劃線開(kāi)頭。②需要特別注意的是ID類(lèi)型屬性的“默認(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ē)(名稱(chēng)*)><!ELEMENT公交電車(chē)(名稱(chēng)*)><!ELEMENT名稱(chēng)(#PCDATA)><!ATTLIST名稱(chēng)車(chē)牌號(hào)ID#REQUIRED>例子14example3_14.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE城市交通SYSTEM"fourteenDTD.dtd"><城市交通><公交電車(chē)><名稱(chēng)車(chē)牌號(hào)="遼B555">101無(wú)軌電車(chē)</名稱(chēng)><名稱(chēng)車(chē)牌號(hào)="遼B888">201有軌電車(chē)</名稱(chēng)></公交電車(chē)><公交汽車(chē)><名稱(chēng)車(chē)牌號(hào)="遼B666">801快車(chē)</名稱(chēng)><名稱(chēng)車(chē)牌號(hào)="遼B777">631普通</名稱(chēng)></公交汽車(chē)></城市交通>fourteenDTD.dtd圖3.11使用解析器檢查出的錯(cuò)誤§3.5.3屬性類(lèi)型_6.IDREF類(lèi)型
6.IDREF類(lèi)型
如果準(zhǔn)備通過(guò)標(biāo)記的屬性值來(lái)判斷標(biāo)記之間的聯(lián)系,就可以在標(biāo)記中使用IDREF(IdentifierReference)類(lèi)型的屬性。IDREF類(lèi)型屬性的屬性值只能取某個(gè)標(biāo)記中ID類(lèi)型屬性的屬性值。例題3-15page52<!ELEMENT簡(jiǎn)歷列表(專(zhuān)科,本科,碩士,博士,姓名*)><!ELEMENT專(zhuān)科EMPTY><!ELEMENT本科EMPTY><!ELEMENT碩士EMPTY><!ELEMENT博士EMPTY><!ELEMENT姓名(#PCDATA)><!ATTLIST專(zhuān)科numberCodeID#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)歷列表><專(zhuān)科numberCode="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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)安全控制系統(tǒng)行業(yè)應(yīng)用狀況及投資模式分析報(bào)告
- 2024-2030年中國(guó)嬰幼兒產(chǎn)品市場(chǎng)競(jìng)爭(zhēng)力策略及投資盈利分析報(bào)告
- 2024-2030年中國(guó)大提花貢緞行業(yè)競(jìng)爭(zhēng)格局及前景趨勢(shì)預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)臺(tái)階鏜刀行業(yè)市場(chǎng)發(fā)展規(guī)模及投資可行性分析報(bào)告
- 眉山藥科職業(yè)學(xué)院《國(guó)際商務(wù)談判實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年昆明住宅購(gòu)買(mǎi)合同
- 2024年漁業(yè)供貨合同
- 主鏡頭和關(guān)系鏡頭
- 2024年度網(wǎng)絡(luò)安全防護(hù)技術(shù)支持服務(wù)合同范本3篇
- 呂梁師范高等專(zhuān)科學(xué)?!妒称飞锛夹g(shù)專(zhuān)題》2023-2024學(xué)年第一學(xué)期期末試卷
- 八年級(jí)道法上冊(cè)第一學(xué)期期末綜合測(cè)試卷(人教版 2024年秋)
- 2025屆江蘇省期無(wú)錫市天一實(shí)驗(yàn)學(xué)校數(shù)學(xué)七年級(jí)第一學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- UG基礎(chǔ)培訓(xùn)課件
- 城市軌道交通運(yùn)營(yíng)管理【共30張課件】
- 鋼結(jié)構(gòu)設(shè)計(jì)智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東建筑大學(xué)
- 2024年廣東省廣州市荔灣區(qū)中考一模語(yǔ)文試題
- 人教版四年級(jí)上冊(cè)數(shù)學(xué)數(shù)學(xué)復(fù)習(xí)資料
- TD/T 1066-2021 不動(dòng)產(chǎn)登記數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)(正式版)
- 睡眠中心宣傳方案
- 2024春期國(guó)開(kāi)電大專(zhuān)科《建筑制圖基礎(chǔ)》在線形考(形考性考核作業(yè)一至四)試題及答案
- 論《國(guó)際貨物銷(xiāo)售合同公約》的適用問(wèn)題
評(píng)論
0/150
提交評(píng)論