版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章XML與W3CXMLSchema模式4.1XMLSchema簡(jiǎn)介4.2XMLSchema的常用內(nèi)置簡(jiǎn)單類(lèi)型4.3XMLSchema聲明簡(jiǎn)單類(lèi)型4.4XMLSchema聲明復(fù)雜類(lèi)型4.5XMLSchema的名稱空間4.6綜合實(shí)例4.7本章小結(jié)習(xí)題44.1XMLSchema簡(jiǎn)介
通過(guò)第2章和第3章的學(xué)習(xí),我們知道XML文檔有結(jié)構(gòu)良好和有效性兩種約束。格式良好適合于所有的XML文檔,即滿足XML標(biāo)準(zhǔn)中對(duì)于格式的規(guī)定,而當(dāng)XML文檔滿足一定的語(yǔ)義約束時(shí)則稱該XML文檔為有效的XML文檔。目前常用的XML檢查有效性的語(yǔ)言有DTD、XDR和XSD。
1.DTD
第3章描述的DTD文檔類(lèi)型定義使用不同于XML的獨(dú)立語(yǔ)法來(lái)規(guī)定了XML文檔中各種元素的內(nèi)容模式,該語(yǔ)言直接沿襲了定義SGML語(yǔ)言的方法。
2.XDR
XDR的全稱是XML-DataReducedLanguage,是早先由XML-Data草案派生出來(lái)的一個(gè)定義XML語(yǔ)言的分支。微軟最先提出了XML-Data,并且經(jīng)過(guò)修訂后在微軟的應(yīng)用軟件中大量使用。
3.XSD
最為正式的XMLSchema語(yǔ)言是由W3C指定的XMLSchema規(guī)范,簡(jiǎn)稱XSD(XMLSchemaDefinition)。XSD也提供了數(shù)據(jù)類(lèi)型的支持和結(jié)構(gòu)定義的方法。
2001年5月2日,XMLSchema規(guī)范成為了W3C的正式推薦標(biāo)準(zhǔn)。這就意味著經(jīng)過(guò)三年多的發(fā)展,XML的Schema標(biāo)準(zhǔn)終于成為業(yè)界統(tǒng)一認(rèn)可的規(guī)范。伴隨著XML、XMLSchema和Namespace相繼成為W3C的正式標(biāo)準(zhǔn),意味著XML語(yǔ)法規(guī)范已經(jīng)奠定了扎實(shí)的基礎(chǔ),XML的廣泛發(fā)展和應(yīng)用也即將成為現(xiàn)實(shí)。4.1.1Schema的本質(zhì)
Schema文檔實(shí)際上是一個(gè)以?.xsd為后綴的文本文件。例4-1的案例給出了一個(gè)簡(jiǎn)單的Schema文檔,通過(guò)這個(gè)案例可以對(duì)Schema有一個(gè)直觀的認(rèn)識(shí)?!纠?-1】
案例說(shuō)明:一個(gè)簡(jiǎn)單的Schema實(shí)例。
程序名稱:ch4-1.xsd
01<?xmlversion="1.0"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="PersonName"type="xsd:string"/>
04</xsd:schema>案例分析:程序ch4-1.xsd給出了一個(gè)由四行代碼寫(xiě)出的Schema文檔。對(duì)上述代碼的分析如下:
第01行代碼<?xmlversion=“1.0”?>在第2章的2.2節(jié)中已經(jīng)學(xué)習(xí)過(guò),該代碼為XML文檔聲明,說(shuō)明該文檔為一個(gè)XML文檔。
第02行及第04行代碼是一個(gè)元素的定義<xsd:schema>和</xsd:schema>,該元素是整個(gè)文檔的唯一根元素,在第2章的2.3.4節(jié)中有根元素的詳細(xì)說(shuō)明。第02行根元素后面緊跟的代碼xmlns:xsd=“http:///2001/XMLSchema”則定義了一個(gè)xsd的命名空間,在第2章的2.4.1節(jié)和2.4.2節(jié)中有關(guān)于命名空間的詳細(xì)說(shuō)明。
第03行代碼是<xsd:schema>的子元素<xsd:element>,該元素有兩個(gè)屬性:type和name。在第2章的2.3.5節(jié)和2.3.6節(jié)中給出了屬性和元素嵌套的詳細(xì)說(shuō)明。
通過(guò)上述對(duì)例4-1的Schema文檔代碼的分析,可以看出該文檔的結(jié)構(gòu)性很強(qiáng),而且完全符合XML文檔的語(yǔ)法規(guī)范,這就是Schema的本質(zhì)——XML文檔。4.1.2使用Schema的原因
已經(jīng)有了DTD文檔來(lái)驗(yàn)證XML文檔的有效性,為什么還要使用Schema來(lái)驗(yàn)證呢?下面通過(guò)實(shí)例來(lái)說(shuō)明其原因。例4-2和例4-3給出的兩個(gè)案例分別使用Schema和DTD驗(yàn)證了同一個(gè)XML文檔,這個(gè)XML文檔的根元素為PersonName,三個(gè)子元素為FullName、FirstName和LastName?!纠?-2】
案例說(shuō)明:使用Schema驗(yàn)證XML文檔的實(shí)例。
程序名稱:ch4-2.xsd
01<?xmlversion="1.0">
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="PersonName">
04<xsd:complexType>
05<xsd:sequence>06<xsd:elementname="FullName"type="xsd:string"/>
07<xsd:elementname="FirstName"type="xsd:string"/>
08<xsd:elementname="LastName"type="xsd:string"/>
09</xsd:sequence>
10</xsd:complexType>
11</xsd:element>
12</xsd:schema>程序名稱:ch4-2.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<PersonNamexmlns:xsi="/2001
/XMLSchema-instance"xsi:noNamespaceSchema
Location="ch4-2.xsd">
03<FullName>樓樺</FullName>
04<FirstName>樓</FirstName>
05<LastName>樺</LastName>
06</PersonName>【例4-3】
案例說(shuō)明:使用DTD驗(yàn)證XML文檔的實(shí)例。
程序名稱:ch4-3.dtd
01<?xmlversion="1.0"encoding="utf-8"?>
02<!ELEMENTFullName(#PCDATA)>
03<!ELEMENTFirstName(#PCDATA)>
04<!ELEMENTLastName(#PCDATA)>
05<!ELEMENTPersonName(FullName,FirstName,LastName)>程序名稱:ch4-3.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<!DOCTYPEPersonNameSYSTEM"ch4-3.dtd">
03<PersonName>
04<FullName>樓樺</FullName>
05<FirstName>樓</FirstName>
06<LastName>樺</LastName>
07</PersonName>案例分析:直接理解例4-2中的Schema是有困難的,但通過(guò)直觀的代碼觀察和分析即可得出Schema和DTD兩種不同定義方法的區(qū)別。
(1)由于Schema是一個(gè)規(guī)范的XML文檔,因此它繼承了XML文檔結(jié)構(gòu)性強(qiáng)的特點(diǎn),各個(gè)元素的嵌套關(guān)系非常直觀。而DTD文檔的結(jié)構(gòu)是平面化的,可以想象,使用DTD在定義嵌套關(guān)系復(fù)雜的XML文檔時(shí),很難把握各個(gè)元素之間的層次和嵌套關(guān)系。
(2)例4-2中的Schema代碼第05行至第07行在定義三個(gè)子元素時(shí)使用了type屬性即type=“xsd:string”,其中string類(lèi)型直觀地表達(dá)了子元素是字符串類(lèi)型的信息。例4-3中的DTD只能表示子元素含有文本,不能再嵌套子元素,對(duì)于文本的具體類(lèi)型,DTD無(wú)法更加精確地進(jìn)行定義。
(3)?Schema本質(zhì)就是XML文檔,而DTD不是XML文檔。用XML文檔來(lái)定義XML文檔對(duì)于理解Schema文檔和構(gòu)造解析器方面具有非常大的優(yōu)勢(shì)。上述兩個(gè)案例提供的信息表達(dá)的Schema相對(duì)于DTD的優(yōu)勢(shì)遠(yuǎn)不止這些,目前在許多XML的應(yīng)用和開(kāi)發(fā)領(lǐng)域,DTD逐漸呈現(xiàn)頹勢(shì)(DTD目前仍然可以勝任定義某些簡(jiǎn)單XML文檔的工作)。Schema作為主流的XML模式,已經(jīng)是一種必然的趨勢(shì)。4.1.3使用Schema驗(yàn)證XML文檔
下面再來(lái)分析一下例4-2中案例包含的兩個(gè)文檔,觀察一下Schema(程序ch4-2.xsd)是如何驗(yàn)證XML文檔(程序ch4-2.xml)的。
1.Schema文檔
(1)第01行代碼<?xmlversion=“1.0”>是XML文檔聲明,Schema在本質(zhì)上是一個(gè)XML文檔。
(2)第02行代碼<xsd:schemaxmlns:xsd=“http://www.w3.org/2001/XMLSchema">和第12行代碼</xsd:schema>定義了整個(gè)Schema文檔的根元素,所有元素和屬性的聲明都必須包含在根元素<xsd:schema>中。命名空間“http://www./2001/XMLSchema”由W3C提供,該案例中將這個(gè)命名空間綁定在前綴“xsd”上,在該文檔中出現(xiàn)的以“xsd”為前綴的元素,都是“/2001/XMLSchema”的一員。本章中的所有案例都將W3C提供的命名空間“/2001/XMLSchema”綁定在前綴“xsd”上。
(3)第03行代碼<xsd:elementname=“PersonName”>和第11行代碼</xsd:element>定義了XML文檔的根元素。元素<xsd:element>也是命名空間“xsd”中的一員,用于聲明一個(gè)元素。name屬性表示被聲明的元素的名稱是“PersonName”。
(4)第04行、05行、09行和第10行代碼均為定義根元素<xsd:elementname=“PersonName”>類(lèi)型的語(yǔ)句,這些代碼將在4.4節(jié)中給出詳細(xì)的說(shuō)明。
(5)第06行至第08行代碼定義了XML文檔根元素的三個(gè)子元素FullName、FirstName和LastName,并且在type屬性中定義了子元素的數(shù)據(jù)類(lèi)型為string字符串類(lèi)型。
2.XML文檔
(1)該文檔與第2章講述的XML文檔的不同之處在于根元素的第02行代碼:
<PersonNamexmlns:xsi=“/2001
/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=“ch4-2.xsd”>
(2)“/2001/XMLSchema-instance”是W3C提供的另一個(gè)特殊的命名空間,該命名空間中的元素和屬性主要用來(lái)將XML文檔與Schema文檔關(guān)聯(lián)起來(lái)。
(3)“xsi:noNamespaceSchemaLocation”用來(lái)定義Schema文件的路徑。由于Schema驗(yàn)證Schema文檔(ch4-2.xsd)和XML文檔(ch4-2.xml)在同一個(gè)文件夾下,這里使用的是相對(duì)路徑“ch4-2.xsd”,本章涉及的所有案例中的Schema文檔和XML文檔都位于同一個(gè)目錄下,全部使用相對(duì)路徑。如果驗(yàn)證文檔使用絕對(duì)路徑,則可以寫(xiě)為“file:///e:/xsd/4-2.xsd”,表示驗(yàn)證文檔位于E盤(pán)的xsd文件夾下,文件名為“4-2.xsd”。
4.2XMLSchema的常用內(nèi)置簡(jiǎn)單類(lèi)型
W3CSchema中定義了44種內(nèi)置數(shù)據(jù)類(lèi)型,本節(jié)將對(duì)其中經(jīng)常使用的七種類(lèi)型進(jìn)行說(shuō)明。這七種類(lèi)型分別是:字符串型、小數(shù)型、整數(shù)型、布爾型、日期型、時(shí)間型和日期時(shí)間型。本節(jié)中說(shuō)明未涉及的類(lèi)型可以查閱W3C的Schema語(yǔ)法說(shuō)明。4.2.1字符串(string)型
字符串類(lèi)型是幾乎每個(gè)高級(jí)編程語(yǔ)言中變量和數(shù)據(jù)庫(kù)字段的類(lèi)型定義中的一種,這個(gè)數(shù)據(jù)類(lèi)型用于定義XML文檔中元素或者屬性的數(shù)據(jù)內(nèi)容為一個(gè)字符串,使用“xsd:string”進(jìn)行定義。例4-4給出的案例說(shuō)明了如何定義一個(gè)字符串類(lèi)型的圖書(shū)名稱元素?!纠?-4】
案例說(shuō)明:使用Schema定義字符串類(lèi)型的元素。
程序名稱:ch4-4.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookName"type="xsd:string"/>
04</xsd:schema>程序名稱:ch4-4.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookNamexmlns:xsi="/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-4.xsd">
03XML學(xué)習(xí)指南
04</BookName>實(shí)際上,所有的元素和屬性的數(shù)據(jù)類(lèi)型都可以是字符串類(lèi)型,就像DTD中定義的數(shù)據(jù)類(lèi)型PCDATA一樣,是數(shù)據(jù)類(lèi)型中最松散的約束,其唯一要求是不能含有特殊字符(如“&”、“>”等2.5節(jié)中預(yù)定義實(shí)體表示的字符)。4.2.2小數(shù)(decimal)型
十進(jìn)制的小數(shù)使用也非常普遍,使用“xsd:decimal”進(jìn)行定義。小數(shù)類(lèi)型的數(shù)據(jù)內(nèi)容可以加上正負(fù)號(hào),分別表示正數(shù)和負(fù)數(shù)。例4-5給出的案例說(shuō)明了如何定義一個(gè)小數(shù)類(lèi)型的圖書(shū)價(jià)格元素?!纠?-5】
案例說(shuō)明:使用Schema定義小數(shù)類(lèi)型的元素。
程序名稱:ch4-5.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookPrice"type="xsd:decimal"/>
04</xsd:schema>程序名稱:ch4-5.xml
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<BookPricexmlns:xsi=“/2001
/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=“ch4-5.xsd”>
0346.50
04</BookPrice>
小數(shù)類(lèi)型最多可以指定18位小數(shù),定義浮點(diǎn)類(lèi)型使用“xsd:float”,定義雙精度浮點(diǎn)類(lèi)型使用“xsd:double”。4.2.3整數(shù)(integer)型
整數(shù)類(lèi)型使用“xsd:integer”進(jìn)行定義,整數(shù)類(lèi)型的數(shù)據(jù)內(nèi)容也可以加上正負(fù)號(hào),分別表示正整數(shù)和負(fù)整數(shù)。如果XML文檔中元素的數(shù)據(jù)內(nèi)容是整數(shù)類(lèi)型而定義該元素的是小數(shù)類(lèi)型,則有效性校驗(yàn)是可以通過(guò)的;如果XML文檔中元素的數(shù)據(jù)內(nèi)容是小數(shù)類(lèi)型(如12.3)而定義該元素的是整數(shù)類(lèi)型,則有效性校驗(yàn)無(wú)法通過(guò)。例4-6給出的案例說(shuō)明了如何定義一個(gè)整數(shù)類(lèi)型的圖書(shū)數(shù)量元素?!纠?-6】
案例說(shuō)明:使用Schema定義整數(shù)類(lèi)型的元素。
程序名稱:ch4-6.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001
/XMLSchema">
03<xsd:elementname="BookNumber"type="xsd:integer"/>
04</xsd:schema>程序名稱:ch4-6.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookNumberxmlns:xsi="/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-6.xsd">
03400
04</BookNumber>“xsd:integer”包含了所有的整數(shù),下面是四個(gè)整數(shù)類(lèi)型的子類(lèi)型定義:
“xsd:positiveInteger”——正整數(shù)定義,即1、2、3、4…;
“xsd:negativeInteger”——負(fù)整數(shù)定義,即?-1、-2、-3、-4…;
“xsd:nonNegativeInteger”——非負(fù)整數(shù)定義,即0、1、2、3、4…;
“xsd:nonPositiveInteger”——非正整數(shù)定義,即0、-1、-2、-3、-4…。
例4-6中的圖書(shū)數(shù)量元素如果表示庫(kù)存數(shù)量,則使用“xsd:nonNegativeInteger”來(lái)進(jìn)行類(lèi)型定義約束性會(huì)更強(qiáng),因?yàn)閹?kù)存的圖書(shū)數(shù)量不可能出現(xiàn)負(fù)整數(shù)。4.2.4布爾(boolean)型
布爾類(lèi)型使用“xsd:boolean”進(jìn)行定義,該類(lèi)型定義的元素一般只包含兩種狀態(tài),如是或否、真或假、正或負(fù)等。使用該數(shù)據(jù)類(lèi)型定義的元素?cái)?shù)據(jù)內(nèi)容可以有兩組:“true”或“false”、“0”或“1”?!?”通常用來(lái)表示“false”;“1”通常用來(lái)表示“true”。例4-7給出的案例說(shuō)明了如何定義一個(gè)布爾類(lèi)型的圖書(shū)是否售完的元素?!纠?-7】
案例說(shuō)明:使用Schema定義布爾類(lèi)型的元素。
程序名稱:ch4-7.xsd
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<xsd:schemaxmlns:xsd=“/2001
/XMLSchema">
03<xsd:elementname="Sellout"type="xsd:boolean"/>
04</xsd:schema>程序名稱:ch4-7.xml
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<Selloutxmlns:xsi=“/2001
/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=“ch4-7.xsd”>
03false
04</Sellout>
案例分析:因?yàn)镾chema的本質(zhì)是XML文檔,所以字母大小寫(xiě)含義是不同的。程序ch4-7.xml中元素<Sellout>取值如果是“False”或者“FALSE”,是無(wú)法通過(guò)有效性校驗(yàn)的。4.2.5日期(date)型
日期類(lèi)型使用“xsd:date”進(jìn)行定義,日期類(lèi)型的格式為YYYY-MM-DD,其中YYYY表示年份,MM表示月份,DD表示日。該類(lèi)型定義的元素?cái)?shù)據(jù)內(nèi)容如果表達(dá)“2008年2月5日”應(yīng)該為“2008-02-05”,如果數(shù)據(jù)內(nèi)容為“2008-2-5”將無(wú)法通過(guò)有效性驗(yàn)證。例4-8給出的案例說(shuō)明了如何定義一個(gè)日期類(lèi)型的圖書(shū)出版日期元素?!纠?-8】
案例說(shuō)明:使用Schema定義日期類(lèi)型的元素。
程序名稱:ch4-8.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="PublishDate"type="xsd:date"/>
04</xsd:schema>程序名稱:ch4-8.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<PublishDatexmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-8.xsd">
032008-06-18
04</PublishDate>4.2.6時(shí)間(time)型
時(shí)間類(lèi)型使用“xsd:time”進(jìn)行定義,時(shí)間類(lèi)型的格式為hh:mm:ss,其中hh表示小時(shí),mm表示分鐘,ss表示秒。該類(lèi)型定義的元素?cái)?shù)據(jù)內(nèi)容如果表達(dá)“20點(diǎn)6分8秒”應(yīng)該為“20:06:08”,如果數(shù)據(jù)內(nèi)容為“20:6:8”將無(wú)法通過(guò)有效性驗(yàn)證。例4-9給出的案例說(shuō)明了如何定義一個(gè)時(shí)間類(lèi)型的檢查時(shí)間元素?!纠?-9】
案例說(shuō)明:使用Schema定義時(shí)間類(lèi)型的元素。
程序名稱:ch4-9.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001
/XMLSchema">
03<xsd:elementname="CheckTime"type="xsd:time"/>
04</xsd:schema>程序名稱:ch4-9.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<CheckTimexmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-9.xsd">
0314:48:25
04</CheckTime>4.2.7日期時(shí)間(dateTime)型
日期時(shí)間類(lèi)型使用“xsd:dateTime”進(jìn)行定義,日期時(shí)間類(lèi)型的格式為YYYY-MM-DDThh:mm:ss,其中大寫(xiě)的“T”是日期與時(shí)間的分隔符,不能缺少。例4-10給出的案例說(shuō)明了如何定義一個(gè)日期時(shí)間類(lèi)型的入庫(kù)時(shí)間元素?!纠?-10】
案例說(shuō)明:使用Schema定義時(shí)間日期類(lèi)型的元素。
程序名稱:ch4-10.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="InstoreDateTime"type="xsd:dateTime"/>
04</xsd:schema>程序名稱:ch4-10.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<InstoreDateTimexmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-10.xsd">
032008-07-12T15:30:00
04</InstoreDateTime>
4.3XMLSchema聲明簡(jiǎn)單類(lèi)型
XMLSchema的定義過(guò)程就是聲明XML文檔元素的過(guò)程。XML文檔元素分為兩大類(lèi):簡(jiǎn)單元素和復(fù)雜元素。簡(jiǎn)單元素是指只含有文本內(nèi)容,不含有子元素和屬性的元素。復(fù)雜元素是指除簡(jiǎn)單元素以外的元素。對(duì)應(yīng)這兩種XML文檔的元素,Schema中也相應(yīng)地存在兩種類(lèi)型,即簡(jiǎn)單類(lèi)型和復(fù)雜類(lèi)型。其中簡(jiǎn)單類(lèi)型又分為內(nèi)置簡(jiǎn)單類(lèi)型(本章4.2節(jié)中案例使用的所有類(lèi)型)和自定義簡(jiǎn)單類(lèi)型。自定義數(shù)據(jù)類(lèi)型都是直接或者間接由內(nèi)置簡(jiǎn)單類(lèi)型衍生出來(lái)的,自定義數(shù)據(jù)類(lèi)型可以理解為施加了特定約束的內(nèi)置簡(jiǎn)單類(lèi)型。對(duì)內(nèi)置簡(jiǎn)單類(lèi)型施加約束,這個(gè)要求是從具體的應(yīng)用需求中產(chǎn)生的。例如定義一個(gè)人的年齡的元素,元素的數(shù)據(jù)類(lèi)型僅有正整數(shù)定義(xsd:positiveInteger)是不夠的,因?yàn)槿说哪挲g不可能達(dá)到200歲,所以要施加正整數(shù)的上限200,這個(gè)上限(200)就是施加在正整數(shù)類(lèi)型(xsd:positiveInteger)上的約束。相似的例子還有百分制的考試成績(jī)(非負(fù)整數(shù)類(lèi)型,約束為大于等于0小于等于100)、中國(guó)人名(字符串類(lèi)型,約束為最少兩個(gè)漢字最多四個(gè)漢字)、貨幣表示(小數(shù)類(lèi)型,約束為保留兩位小數(shù))等。4.3.1限制字符串的長(zhǎng)度
限制字符串的長(zhǎng)度采用<xsd:minLengthvalue="***"/>指定最小長(zhǎng)度,采用<xsd:maxLengthvalue="***"/>指定最大長(zhǎng)度。例4-11的案例給出了一個(gè)定義圖書(shū)作者名稱元素類(lèi)型的Schema文檔。
【例4-11】
案例說(shuō)明:使用Schema定義一個(gè)具有字符串長(zhǎng)度的限制的簡(jiǎn)單類(lèi)型,由字符串類(lèi)型派生。
程序名稱:ch4-11.xsd
01<?xmlversion=“1.0”?>
02<xsd:schemaxmlns:xsd=“/2001
/XMLSchema”>
03<xsd:elementname=“PersonName”>
04<xsd:simpleType>05<xsd:restrictionbase="xsd:string">
06<xsd:minLengthvalue="2"/>
07<xsd:maxLengthvalue="4"/>
08</xsd:restriction>
09</xsd:simpleType>
10</xsd:element>
11</xsd:schema>程序名稱:ch4-11.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<PersonNamexmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-11.xsd">
03樓樺
04</PersonName>
案例分析:Schema文檔ch4-11.xsd中的第04行代碼塊<xsd:simpleType>表示聲明一個(gè)自定義簡(jiǎn)單類(lèi)型。該聲明簡(jiǎn)單類(lèi)型定義緊跟在第03行代碼<xsd:elementname="PersonName">之后,表明聲明的是XML文檔中元素<PersonName>的數(shù)據(jù)內(nèi)容類(lèi)型。
Schema文檔ch4-11.xsd中的第05行代碼<xsd:restrictionbase=“xsd:string”>說(shuō)明新類(lèi)型是一個(gè)基于xsd:string類(lèi)型的約束。
Schema文檔ch4-11.xsd中的第06行代碼<xsd:minLengthvalue=“2”/>中使用關(guān)鍵字“minLength”來(lái)限定字符串的最小長(zhǎng)度,最小長(zhǎng)度的值由“value”屬性的值“2”指定。
Schema文檔ch4-11.xsd中的第07行代碼<xsd:maxLengthvalue=“4”/>中使用關(guān)鍵字“maxLength”來(lái)限定字符串的最大長(zhǎng)度,最大長(zhǎng)度的值由“value”屬性的值“4”指定。
在字符串中,無(wú)論是中文字符還是英文字符,都被當(dāng)做一個(gè)字符來(lái)看待。例4-11中的程序ch4-11.xsd第04行至第09行代碼塊定義了第03行聲明的元素<xsd:elementname="PersonName">,這個(gè)代碼塊將自定義類(lèi)型聲明與元素聲明進(jìn)行了嵌套,Schema文檔復(fù)雜時(shí)會(huì)導(dǎo)致代碼的可讀性和重用性下降。所以一般都采用元素聲明和類(lèi)型聲明隔離的方法進(jìn)行代碼的編寫(xiě)。程序ch4-11.xsd可以改寫(xiě)為如程序ch4-11-1.xsd所示的代碼:程序名稱:ch4-11-1.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="PersonName"type="AuthorNameType"/>04<xsd:simpleTypename="AuthorNameType">
05<xsd:restrictionbase="xsd:string">
06<xsd:minLengthvalue="2"/>
07<xsd:maxLengthvalue="4"/>
08</xsd:restriction>
09</xsd:simpleType>
10</xsd:schema>案例分析:程序ch4-11-1.xsd的第04行至第09行代碼塊依然聲明了一個(gè)簡(jiǎn)單類(lèi)型,但是和源Schema文檔ch4-11.xsd不同的是,首先將聲明簡(jiǎn)單類(lèi)型的代碼塊從<xsd:element>中取出,該代碼塊成為<xsd:schema>元素的子元素。
程序ch4-11-1.xsd的第04行元素<xsd:simpleType>在聲明簡(jiǎn)單類(lèi)型的語(yǔ)句中加入了屬性“name”的值來(lái)定義聲明簡(jiǎn)單類(lèi)型的名稱,上面程序的第04行至第09行代碼塊聲明的簡(jiǎn)單類(lèi)型名稱為“AuthorNameType”。程序ch4-11-1.xsd的第03行代碼中將聲明元素<xsd:elementname=“PersonName”>的數(shù)據(jù)內(nèi)容類(lèi)型用屬性“type”的值“AuthorNameType”定義為第04行~09行代碼塊聲明的簡(jiǎn)單類(lèi)型。
本章所提供的案例中Schema文檔類(lèi)型聲明的代碼編寫(xiě)方式一律采用程序ch4-11-1.xsd的類(lèi)型聲明方式書(shū)寫(xiě)。4.3.2限制數(shù)值的取值范圍
限制數(shù)值的取值范圍采用<xsd:minInclusivevalue="***"/>指定臨界最小值,采用<xsd:max-Inclusivevalue="***"/>指定臨界最大值,使用這兩個(gè)關(guān)鍵字聲明的取值范圍包括邊界值。例4-12的案例給出了一個(gè)定義圖書(shū)價(jià)格元素類(lèi)型的Schema文檔。
【例4-12】
案例說(shuō)明:使用Schema定義一個(gè)具有取值范圍限制的簡(jiǎn)單類(lèi)型,由小數(shù)類(lèi)型派生。
程序名稱:ch4-12.xsd
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<xsd:schemaxmlns:xsd=“/2001/XMLSchema”>
03<xsd:elementname=“BookPrice”type=“PriceType”/>
04<xsd:simpleTypename="PriceType">05<xsd:restrictionbase="xsd:decimal">
06<xsd:minExclusivevalue="0"/>
07<xsd:maxInclusivevalue="200"/>
08</xsd:restriction>
09</xsd:simpleType>
10</xsd:schema>程序名稱:ch4-12.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookPricexmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-12.xsd">
0325.60
04</BookPrice>案例分析:由于圖書(shū)價(jià)格不可能是0,因此程序ch4-12.xsd中的第06行代碼使用<xsd:minExclusivevalue="0"/>指定臨界最小值“0”,表示元素的值必須大于最小值“0”。上面案例中圖書(shū)價(jià)格元素的取值范圍為“0<圖書(shū)價(jià)格元素值≤200”。同樣可以使用<xsd:maxExclusivevalue="***"/>指定臨界最大值,表示元素的值必須小于最大值。4.3.3限制小數(shù)位數(shù)
限制小數(shù)位數(shù)使用<xsd:fractionDigitsvalue=“***”/>來(lái)定義數(shù)字的小數(shù)部分位數(shù)。例4-13的案例給出了一個(gè)定義圖書(shū)價(jià)格元素類(lèi)型的Schema文檔。
【例4-13】
案例說(shuō)明:使用Schema定義一個(gè)具有取值范圍限制和小數(shù)位數(shù)限制的簡(jiǎn)單類(lèi)型,由小數(shù)類(lèi)型派生。程序名稱:ch4-13.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookPrice"type="PriceType"/>
04<xsd:simpleTypename="PriceType">
05<xsd:restrictionbase="xsd:decimal">
06<xsd:fractionDigitsvalue="2"/>07<xsd:minExclusivevalue="0"/>
08<xsd:maxInclusivevalue="200"/>
09</xsd:restriction>
10</xsd:simpleType>
11</xsd:schema>程序名稱:ch4-13.xml
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<BookPricexmlns:xsi=“/2001
/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=“ch4-13.xsd”>
0325.60
04</BookPrice>
案例分析:第06行代碼指定了小數(shù)位數(shù)為“2”,如果要對(duì)數(shù)字的總位數(shù)進(jìn)行約束則使用<xsd:totalDigitsvalue="***"/>進(jìn)行限定,同樣value屬性的值指定了數(shù)字總位數(shù)。4.3.4枚舉類(lèi)型
如果遇到表達(dá)星期幾的元素時(shí)只能從七個(gè)取值(星期一、星期二、星期三、星期四、星期五、星期六和星期天)中取出一個(gè)值;如果表達(dá)奧運(yùn)會(huì)比賽獎(jiǎng)牌的元素只能從三個(gè)取值(金牌、銀牌、銅牌)中取出一個(gè)值;如果表達(dá)小寫(xiě)字母元素只能從26個(gè)取值(a、b、c、…、z)中取出一個(gè)值。
上面所描述的元素類(lèi)型就可以定義為枚舉類(lèi)型,枚舉類(lèi)型是一種取值集合。定義枚舉類(lèi)型使用<xsd:enumerationvalue="***"/>,value屬性的取值則定義了取值集合中的一個(gè)值。例4-14的案例給出了一個(gè)定義性別元素類(lèi)型的Schema文檔。
【例4-14】
案例說(shuō)明:使用Schema定義一個(gè)枚舉簡(jiǎn)單類(lèi)型,由字符串類(lèi)型派生。
程序名稱:ch4-14.xsd
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<xsd:schemaxmlns:xsd=“/2001
/XMLSchema”>
03<xsd:elementname=“Gender”type
=“GenderEnumType”/>
04<xsd:simpleTypename=“GenderEnumType”>
05<xsd:restrictionbase="xsd:string">06<xsd:enumerationvalue="男"/>
07<xsd:enumerationvalue="女"/>
08</xsd:restriction>
09</xsd:simpleType>
10</xsd:schema>程序名稱:ch4-14.xml
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<Genderxmlns:xsi=“/2001
/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=“ch4-14.xsd”>
03男
04</Gender>
案例分析:在程序ch4-13.xsd中第03行代碼定義的“Gender”元素在XML實(shí)例文檔中只能取“男”(第06行定義)或“女”(第07行定義)中的一個(gè)值。4.3.5模式匹配
本章前面小節(jié)講述了如何給數(shù)據(jù)類(lèi)型施加長(zhǎng)度約束、取值范圍約束和取值集合約束。如果要對(duì)電話號(hào)碼這樣的數(shù)據(jù)類(lèi)型施加約束,應(yīng)該如何進(jìn)行?電話號(hào)碼的典型取值例子有、、等,約束的表達(dá)應(yīng)該是“三位或者四位數(shù)字”加上“-”再加上“七位或者八位數(shù)字”。對(duì)于這種數(shù)據(jù)類(lèi)型的格式約束使用<xsd:patternvalue=“\正則表達(dá)式”/>來(lái)進(jìn)行指定,其中value屬性的值為一個(gè)正則表達(dá)式。電話號(hào)碼的約束表達(dá)為“三位或者四位數(shù)字”加上“-”再加上“七位或者八位數(shù)字”,正則表達(dá)式為“\d{3,4}-\d{7,8}”。
再比如,對(duì)于一個(gè)正規(guī)出版的書(shū)籍,一般都有一個(gè)ISBN(InternationalStandardBookNumber,國(guó)際標(biāo)準(zhǔn)書(shū)號(hào))。例如ISBN7-5606-0534-6/TP0264表達(dá)的就是一個(gè)中國(guó)境內(nèi)出版的圖書(shū)標(biāo)準(zhǔn)編號(hào),其中:7代表該書(shū)是中國(guó)出版的;
5606是由國(guó)家ISBN中心分配給該書(shū)的;
0535是出版社自己給出的;
6是電子計(jì)算機(jī)的校驗(yàn)碼;
TP指該書(shū)是“自動(dòng)化技術(shù)、計(jì)算機(jī)技術(shù)”方面的;
0624是書(shū)的特征數(shù)據(jù)。
例4-15的案例給出了一個(gè)定義圖書(shū)ISBN類(lèi)型的Schema文檔。
【例4-15】
案例說(shuō)明:使用Schema定義一個(gè)具有強(qiáng)制格式及位數(shù)的簡(jiǎn)單類(lèi)型,由字符串類(lèi)型派生。
程序名稱:ch4-15.xsd
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<xsd:schemaxmlns:xsd=“/2001/XMLSchema”>
03<xsd:elementname=“ISBN”type=“ISBNType”/>
04<xsd:simpleTypename=“ISBNType”>
05<xsd:restrictionbase="xsd:string">06<xsd:patternvalue="\d{1}-\d{4}-\d{4}-\d{1}/TP\d{4}"/>
07<xsd:lengthvalue="20"/>
08</xsd:restriction>
09</xsd:simpleType>
10</xsd:schema>程序名稱:ch4-15.xml
01<?xmlversion=“1.0”encoding=“utf-8”?>
02<ISBNxmlns:xsi=“/2001
/XMLSchema-instance”
xsi:noNamespaceSchemaLocation=“ch4-15.xsd”>
037-5606-0492-7/TP0229
04</ISBN>
案例分析:注意程序ch4-15.xsd中第06行代碼表達(dá)的value屬性值中的正則表達(dá)式“\d{1}-\d{4}-\d{4}-\d{1}/TP\d{4}”,其中的“/TP”和“-”都代表占位符。4.3.6元素的固定值和默認(rèn)值
本章上述各節(jié)講述的元素的一般定義形式為<xsd:elementname=“elementName”type=“elementType”/>,其中name和type屬性是必需的屬性,另外還有兩個(gè)可選屬性——default(默認(rèn)值)和fixed(固定值)。
元素的默認(rèn)值是在Schema文檔元素的聲明中預(yù)先設(shè)定的元素值。當(dāng)XML文檔元素的內(nèi)容為空時(shí),處理器會(huì)將Schema文檔元素的預(yù)設(shè)值當(dāng)作該元素的值。元素的固定值也是在Schema文檔元素的聲明中預(yù)先設(shè)定的元素值。固定值限定XML文檔元素出現(xiàn)時(shí),其值必須和Schema文檔元素的預(yù)設(shè)固定值相等??梢岳斫鉃橹挥幸粋€(gè)枚舉值的枚舉類(lèi)型,例如水在正常氣壓下的沸點(diǎn)溫度只能是100℃,其Schema元素聲明為:
<xsd:elementname=“Boil_temperature”type=“xsd:integer”fixed=“100”/>
例4-16的案例給出了一個(gè)帶有默認(rèn)值屬性的圖書(shū)數(shù)量元素的Schema文檔?!纠?-16】
案例說(shuō)明:使用Schema定義具有默認(rèn)值的元素。
程序名稱:ch4-16.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookNumber"type="xsd:integer"default="0"/>
04</xsd:schema>程序名稱:ch4-16.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookNumberxmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-16.xsd">
03</BookNumber>案例分析:處理器在處理程序ch4-16.xml的文檔時(shí),元素<BookNumber>沒(méi)有數(shù)據(jù)內(nèi)容,處理器會(huì)將該元素的內(nèi)容視為Schema元素聲明中屬性default的值——整數(shù)“0”。本案例中,處理器只是將XML文檔中元素的值視為默認(rèn)值,并未改變XML文檔的內(nèi)容,這點(diǎn)要特別注意。將程序ch4-16.xsd中的第03行代碼指定默認(rèn)值的代碼“default="0"”刪除后,程序ch4-16.xml將無(wú)法通過(guò)有效性驗(yàn)證。因?yàn)槲丛O(shè)定默認(rèn)值,處理器在遇到元素?cái)?shù)據(jù)內(nèi)容為空時(shí),將使用空字符串進(jìn)行有效性校驗(yàn)。而第03行代碼定義該元素的數(shù)據(jù)類(lèi)型為“integer”,所以無(wú)法通過(guò)校驗(yàn)。
4.4XMLSchema聲明復(fù)雜類(lèi)型
復(fù)雜元素的類(lèi)型聲明由于子元素和屬性的存在,相應(yīng)的約束也比簡(jiǎn)單元素的類(lèi)型聲明要復(fù)雜。本節(jié)將介紹聲明復(fù)雜類(lèi)型所采用的主要技術(shù)。4.4.1定義元素順序
一個(gè)元素通常會(huì)包含很多子元素,例如關(guān)于圖書(shū)信息的描述可能包含作者姓名、作者年齡、作者性別這三個(gè)子元素。多個(gè)子元素的存在首先要解決的就是順序問(wèn)題,Schema提供了all(任意順序)、sequence(特定順序)和choice(選擇順序)三種指示符來(lái)解決這個(gè)問(wèn)題。
例4-17給出了一個(gè)使用all指示符的聲明圖書(shū)信息的復(fù)雜類(lèi)型聲明,其中聲明了父元素圖書(shū)信息“BookInfo”,以及子元素圖書(shū)作者性別“AuthorGender”、圖書(shū)作者年齡“AuthorAge”和圖書(shū)作者姓名“AuthorName”?!纠?-17】
案例說(shuō)明:使用順序指示符all定義的復(fù)雜類(lèi)型。
程序名稱:ch4-17.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookInfo">
04<xsd:complexType>
05<xsd:all>06<xsd:elementname="AuthorGender"type="xsd:string"/>
07<xsd:elementname="AuthorAge"type
="xsd:positiveInteger"/>
08<xsd:elementname="AuthorName"type
="xsd:string"/>
09</xsd:all>
10</xsd:complexType>
11</xsd:element>
12</xsd:schema>程序名稱:ch4-17.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookInfoxmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-17.xsd">
03<AuthorName>樓樺</AuthorName>
04<AuthorAge>32</AuthorAge>
05<AuthorGender>男</AuthorGender>
06</BookInfo>案例分析:程序ch4-17.xsd的第04行代碼<xsd:complexType>和第10行代碼</xsd:complexType>用來(lái)聲明復(fù)雜類(lèi)型,而4.2節(jié)中聲明簡(jiǎn)單類(lèi)型使用的是<xsd:sampleType>。
程序ch4-17.xsd的第05行代碼<xsd:all>和第09行代碼</xsd:all>使用“all”指示符進(jìn)行了子元素的順序定義,該指示符中定義的子元素在XML文檔中必須出現(xiàn),但順序可以任意。程序ch4-17.xsd的第06行、第07行和第08行代碼分別定義了<BookInfo>的三個(gè)子元素<AuthorGender>、<AuthorAge>和<AuthorName>。程序ch4-17.xml中元素的順序?yàn)?lt;AuthorName>、<AuthorAge>、<AuthorGender>。該XML文檔可以通過(guò)有效性驗(yàn)證,因?yàn)镾chema中的子元素順序指示符為all,即任意順序。
例4-18給出了一個(gè)使用sequence指示符的聲明圖書(shū)信息的復(fù)雜類(lèi)型聲明?!纠?-18】
案例說(shuō)明:使用順序指示符sequence定義的復(fù)雜類(lèi)型。
程序名稱:ch4-18.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookInfo">
04<xsd:complexType>
05<xsd:sequence>06<xsd:elementname="AuthorGender"
type="xsd:string"/>
07<xsd:elementname="AuthorAge"
type="xsd:positiveInteger"/>
08<xsd:elementname="AuthorName"
type="xsd:string"/>
09</xsd:sequence>
10</xsd:complexType>
11</xsd:element>
12</xsd:schema>程序名稱:ch4-18.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookInfoxmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-18.xsd">
03<AuthorGender>男</AuthorGender>
04<AuthorAge>32</AuthorAge>
05<AuthorName>樓樺</AuthorName>
06</BookInfo>案例分析:程序ch4-18.xml中<BookInfo>的三個(gè)子元素必須出現(xiàn),且順序必須和程序ch4-18.xsd中定義的子元素順序一致,因?yàn)镾chema中的子元素順序指示符為sequence,即特定順序。Schema文檔定義的子元素沒(méi)有出現(xiàn)在XML文檔中或者XML文檔中子元素的順序和Schema文檔定義的不同,XML文檔都不能通過(guò)有效性校驗(yàn)。
例4-19給出了一個(gè)使用choice指示符的聲明圖書(shū)信息的復(fù)雜類(lèi)型聲明?!纠?-19】
案例說(shuō)明:使用順序指示符choice定義的復(fù)雜類(lèi)型。
程序名稱:ch4-19.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookInfo">
04<xsd:complexType>
05<xsd:choice>06<xsd:elementname="AuthorGender"
type="xsd:string"/>
07<xsd:elementname="AuthorAge"
type="xsd:positiveInteger"/>
08<xsd:elementname="AuthorName"
type="xsd:string"/>
09</xsd:choice>
10</xsd:complexType>
11</xsd:element>
12</xsd:schema>程序名稱:ch4-19.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookInfoxmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-19.xsd">
03<AuthorAge>32</AuthorAge>
04</BookInfo>案例分析:程序ch4-19.xsd中定義的元素<BookInfo>的三個(gè)子元素在XML文檔中必須出現(xiàn)且只能出現(xiàn)一個(gè)子元素,因?yàn)镾chema中的子元素順序指示符為choice,即選擇順序。XML文檔中子元素的數(shù)量多于一個(gè),XML文檔將不能通過(guò)有效性校驗(yàn)??梢园裞hoice指示符理解為針對(duì)Schema定義子元素的一個(gè)枚舉。4.4.2定義元素出現(xiàn)次數(shù)
解決了復(fù)雜類(lèi)型聲明中的子元素順序問(wèn)題,緊接著就要解決子元素在父元素中以一定的順序出現(xiàn)以后,在父元素中要出現(xiàn)多少的問(wèn)題。Schema提供了子元素屬性minOccurs的值來(lái)指定子元素在父元素中的最少出現(xiàn)數(shù)量,屬性maxOccurs的值來(lái)指定子元素在父元素中的最多出現(xiàn)數(shù)量。當(dāng)沒(méi)有顯式設(shè)定時(shí),這兩個(gè)屬性的默認(rèn)值都為1;當(dāng)屬性maxOccurs的值為“unbounded”時(shí),表示不限制子元素在父元素中的出現(xiàn)次數(shù)。例4-20給出了一個(gè)使用定義子元素出現(xiàn)次數(shù)來(lái)聲明復(fù)雜類(lèi)型的案例。使用該案例的Schema定義的XML文檔中,子元素圖書(shū)作者姓名“AuthorName”在父元素圖書(shū)信息“BookInfo”中只能出現(xiàn)一次,而子元素聯(lián)系方式“LinkWay”在父元素圖書(shū)信息“BookInfo”中的出現(xiàn)次數(shù)將不被限制。
【例4-20】
案例說(shuō)明:使用minOccurs和maxOccurs屬性定義的復(fù)雜類(lèi)型。程序名稱:ch4-20.xsd
01<?xmlversion="1.0"encoding="utf-8"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookInfo">
04<xsd:complexType>
05<xsd:sequence>06<xsd:elementname="AuthorName"type="xsd:string"minOccurs="1"/>
07<xsd:elementname="LinkWay"type="xsd:string"maxOccurs="unbounded"/>
08</xsd:sequence>
09</xsd:complexType>
10</xsd:element>
11</xsd:schema>程序名稱:ch4-20.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookInfoxmlns:xsi="/2001
/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-20.xsd">
03<AuthorName>樓樺</AuthorName>
04<LinkWay>lt;/LinkWay>
05<LinkWay>lt;/LinkWay>
06<LinkWay>LOUHUAZZU@163.com</LinkWay>
07</BookInfo>需要注意順序指示符中的任意順序all,使用該指示符其內(nèi)部聲明的元素maxOccurs屬性值不能設(shè)置為大于1的數(shù)值,因?yàn)閍ll所限定的子元素在其父元素中最多只能出現(xiàn)一次。4.4.3屬性聲明
解決了復(fù)雜類(lèi)型聲明中的子元素在父元素中出現(xiàn)的順序問(wèn)題,以及子元素在父元素中出現(xiàn)多少的問(wèn)題,本節(jié)將解決如何定義屬性的問(wèn)題。Schema采用<xsd:attributename=“attributeName”type=“attributeType”/>來(lái)進(jìn)行屬性聲明。在有順序指示符的復(fù)雜類(lèi)型聲明中,屬性聲明必須在順序指示符的結(jié)束標(biāo)記后進(jìn)行聲明。
例4-21中Schema文檔定義了元素圖書(shū)信息“BookInfo”,該元素還定義了一個(gè)屬性—國(guó)際標(biāo)準(zhǔn)書(shū)號(hào)“ISBN”?!纠?-21】
案例說(shuō)明:定義元素屬性的Schema案例。
程序名稱:ch4-21.xsd
01<?xmlversion="1.0"?>
02<xsd:schemaxmlns:xsd="/2001/XMLSchema">
03<xsd:elementname="BookInfo">
04<xsd:complexType>
05<xsd:sequence>
06<xsd:elementname="BookName"type="xsd:string"/>07<xsd:elementname="AuthorName"type="xsd:string"/>
08</xsd:sequence>
09<xsd:attributename="ISBN"type="xsd:string"use="required"/>
10</xsd:complexType>
11</xsd:element>
12</xsd:schema>程序名稱:ch4-21.xml
01<?xmlversion="1.0"encoding="utf-8"?>
02<BookInfoISBN="7-5606-0492-7/TP0229"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ch4-21.xsd">
03<BookName>XML編程指南</BookName>
04<AuthorName>樓樺</AuthorName>
05</BookInfo>案例分析:注意到程序ch4-21.xsd第09行代碼中不僅定義了屬性名稱“name”和屬性類(lèi)型“type”,還使用“use”選項(xiàng)定義了“ISBN”屬性是否必須出現(xiàn)在XML文檔中。在本案例中,“ISBN”屬性被設(shè)置為必須出現(xiàn)“required”?!皍se”選項(xiàng)的取值可以是“required”、“optional”或“prohibited”,這三個(gè)取值的含義如下:
①值required代表定義的屬性必須出現(xiàn)在XML文檔中;
②值optional代表定義的屬性可以出現(xiàn)也可以不出現(xiàn)在XML文檔中;
③值prohibited代表定義的屬性不能出現(xiàn)在XML文檔中。如果一個(gè)屬性聲明沒(méi)有定義use選項(xiàng),那么該選項(xiàng)的默認(rèn)值為“optional”。屬性聲明中同樣有“default”和“fixed”兩個(gè)選項(xiàng)?!癲efault”選項(xiàng)用來(lái)給屬性賦以默認(rèn)值,該默認(rèn)值只有當(dāng)屬性未出現(xiàn)在XML文檔中時(shí),處理器才把屬性的值視為“default”選項(xiàng)設(shè)定的值?!癴ixed”選項(xiàng)用于限制屬性為固定值。4.4.4ref引用
下面的案例提供了一個(gè)表達(dá)圖書(shū)信息“BookInfo”的Schema定義(程序ch4-22.xsd),這個(gè)Schema文檔定義的元素嵌套信息如圖4-1所示。圖4-1案例4-22表達(dá)的元素嵌套層次樹(shù)
【例4-22】
案例說(shuō)明:未使用ref引用元素聲明的Schema定義類(lèi)型的案例。
程序名稱:ch4-22.xsd
01<?xmlversion=“1.0”?>
02<xsd:schemaxmlns:xsd=“/2001/XMLSchema”>
03<xsd:elementname=“BookInfo”>
04<xsd:complexType>
05<xsd:sequence>
06<xsd:elementname="BookName"type="xsd:string"/>07<xsd:elementname="PublisherAddress">
08<xsd:complexType>
09<xsd:sequence>
10<xsd:elementname="Province"
type="xsd:string"/>
11<xsd:elementname="City"type="xsd:string"/>
12<xsd:elementname="AddressDetail"typ
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國(guó)際船舶租賃合同環(huán)境保護(hù)責(zé)任與履約評(píng)估3篇
- 二零二五版?zhèn)€人住房抵押貸款合同2篇
- 2025年度家具租賃服務(wù)合同標(biāo)準(zhǔn)文本4篇
- 2025年肉類(lèi)加工企業(yè)鮮豬肉原料采購(gòu)合同3篇
- 2025年度生態(tài)農(nóng)業(yè)園區(qū)商鋪?zhàn)赓U合同規(guī)范2篇
- 2024租賃公司設(shè)備租賃與購(gòu)買(mǎi)合同
- 二零二五版高壓電纜敷設(shè)電力施工勞務(wù)合同范本2篇
- 二零二五年度礦產(chǎn)品出口與國(guó)內(nèi)銷(xiāo)售合同3篇
- 2025年度運(yùn)動(dòng)服飾租賃服務(wù)合同樣本3篇
- 2025年度農(nóng)機(jī)作業(yè)租賃與農(nóng)村土地流轉(zhuǎn)服務(wù)合同
- 宮腔鏡術(shù)后護(hù)理查房1
- 農(nóng)村勞動(dòng)力流動(dòng)對(duì)農(nóng)村居民消費(fèi)的影響研究
- 藏毛囊腫不伴有膿腫的護(hù)理查房
- 創(chuàng)新科技2024年的科技創(chuàng)新和產(chǎn)業(yè)升級(jí)
- 喜迎藏歷新年活動(dòng)方案
- 進(jìn)修人員培養(yǎng)考核鑒定簿
- 四年級(jí)上冊(cè)脫式計(jì)算400題及答案
- 2024年山東省春季高考技能考試汽車(chē)專業(yè)試題庫(kù)-上(單選題匯總)
- 前程無(wú)憂IQ測(cè)評(píng)題庫(kù)
- 《現(xiàn)代電氣控制技術(shù)》課件
- 江蘇決勝新高考2023屆高三年級(jí)12月大聯(lián)考英語(yǔ)試題含答案
評(píng)論
0/150
提交評(píng)論