XML Schema是2001年5月正式發(fā)布的W3C的推薦標(biāo)準(zhǔn),經(jīng)過數(shù)年的大范圍討論和開發(fā)如今終究塵埃落定,成為全球公認(rèn)的XML環(huán)境下首選的數(shù)據(jù)建模工具。
使用DTD雖然帶來較大的方便,但是,DTD存在1些缺點(diǎn):1是它用不同于XML的語言編寫,需要不同的分析器技術(shù)。這增加了工具開發(fā)商的負(fù)擔(dān),下降了軟件瘦身的可能性,另外開發(fā)人員需要多學(xué)1門語言及其語法。而XML Schema是按標(biāo)準(zhǔn)XML規(guī)則編寫的,更容易掌握。2是DTD不支持名稱空間。隨著大部份的數(shù)據(jù)處理日趨以XML為中心,信息的相互聯(lián)系變得日趨普及與深入,名稱空間作用也將凸現(xiàn)。3是DTD在支持繼承和子類方面的局限性。由于面向?qū)ο蠹夹g(shù)的出現(xiàn),對(duì)繼承和子類的支持已成為軟件技術(shù)領(lǐng)域的主流概念。最后,DTD沒有數(shù)據(jù)類型的概念,沒法對(duì)特定元素施加數(shù)據(jù)類型,對(duì)強(qiáng)迫性結(jié)構(gòu)化無計(jì)可施,例如,如何規(guī)定名為Date的數(shù)據(jù)必須包括有效值。
這些就要依托XML Schema了。XML Schema不但可以定義XML文檔的結(jié)構(gòu)而且還允許束縛文檔的內(nèi)容,這不同于DTD。另外,1個(gè) XML Schema本身就是1個(gè)XML文檔,其基于標(biāo)簽的語法比DTD中的特殊字符要清楚多了。XML Schema正是針對(duì)這些DTD的缺點(diǎn)而設(shè)計(jì)的,它完全使用XML作為描寫手段,具有很強(qiáng)的描寫能力、擴(kuò)大能力和處理保護(hù)能力。
XML Schema是用1套預(yù)先規(guī)定的XML元素和屬性創(chuàng)建的,這些元素和屬性定義了文檔的結(jié)構(gòu)和內(nèi)容模式。
XML Schema也是Web Services技術(shù)中需要使用的1個(gè)基本工具,但是其實(shí)不是XML Schema的所有特性都會(huì)被廣泛地使用,因此,本書將不對(duì)XML Schema規(guī)范做系統(tǒng)的介紹。目前主要有兩種重要的模式:Microsoft XML Schema和W3C XML Schema,本章主要討論W3C XML Schema。
在下面的例子中,通過使用出現(xiàn)在Schema元素中的名稱空間聲明xmlns:xsd= “http://www.w3.org/2001/XMLSchema”,使得模式文檔中的每個(gè)元素都有1個(gè)與XML Schema名稱空間相干聯(lián)的名稱空間前綴xsd。雖然在語法上,可使用任意的前綴情勢,但是,名稱空間前綴xsd被約定用于表示XML Schema名稱空間。由于使用一樣的前綴,所以一樣的關(guān)聯(lián)就會(huì)出現(xiàn)在內(nèi)置的簡單類型的名字中,例如xsd:string。這類情勢關(guān)聯(lián)的目的是用來表示當(dāng)前的元素或簡單類型屬于XML Schema語言的內(nèi)置定義,而不屬于模式文檔作者自己的辭匯表。為了在這里清楚并且簡單地表示,僅提及元素的名字和簡單類型名,而疏忽它們的前綴xsd。
1個(gè)XSDL(XML Schema Definition Language)文檔由元素、屬性、名稱空間和XML文檔中的其他結(jié)點(diǎn)構(gòu)成,并且最少要包括:schema根元素、XML模式名稱空間的定義和元素定義。
【例5.1】 關(guān)于書籍信息的XML文檔,代碼如源程序code5_1.xml所示。
如何寫這個(gè)XML文檔的Schema呢?可以簡單地依照它的結(jié)構(gòu)來定義它的每一個(gè)元素。首先加入1個(gè)xsd:schema元素。
每一個(gè)Schema文檔都是從schema元素開始,并且只能有1個(gè),用以控制Schema所使用的名稱空間和另外幾個(gè)選項(xiàng),現(xiàn)在的Schema標(biāo)準(zhǔn)有好幾種,這里決定它所采取的標(biāo)準(zhǔn),因此是非常重要的。
對(duì)應(yīng)著XML文檔的book元素,一樣也定義1個(gè)名為book的元素(element)。由于這個(gè)元素有屬性(attributes)和非文本的子元素(non-text children),所以認(rèn)為它是1個(gè)復(fù)雜類型(complexType)。而對(duì)簡單類型,只能有值,不能有子元素或?qū)傩浴M瑫r(shí)還注意到book元素下的子元素,都依照1定的順序排列,因此使用順序元素(sequence element)來描寫。
順序元素(sequence element)是1個(gè)定義子元素排列順序的元素,在下面的章節(jié),還將介紹其他類似的元素,如選擇(choice)和全選(all)。
接著定義title和author,都是xsd:string類型的簡單元素,由于沒有屬性(attributes)或子元素。xsd:string是1個(gè)已在名域中預(yù)定義了的XML Schema類型中的1個(gè)。
接著,來處理publish元素,它也是1個(gè)復(fù)雜類型,注意它的基數(shù)的定義。
同其他Schema定義語言不1樣,W3C XML Schema允許定義1個(gè)元素的使用基數(shù),能指定元素的minOccurs(最小數(shù))和maxOccurs(最大數(shù))。這里設(shè)置maxOccurs為unbounded,這意味著能有任意多的publish元素。這兩個(gè)屬性的默許值都是1。下面,用一樣的方法定義其他的子元素。
下面封閉complexType和element等元素。
這樣publish元素就完成了,然后封閉book的sequence元素。
現(xiàn)在,聲明book元素的屬性,通常是在最后這么做。這樣做沒有甚么特別的緣由,只不過W3C XML Schema工作組認(rèn)為在元素后定義屬性感覺更加自然。
最后,封閉所有剩下的元素。
至此,1個(gè)Schema已完成了。其中,最關(guān)鍵的在于根據(jù)文檔的上下關(guān)系來定義每個(gè)元素和屬性,并且允許有多個(gè)同名元素帶有不同的內(nèi)容。為了這個(gè)目的,W3C XML Schema被設(shè)計(jì)成1種有作用域的語言,它的每個(gè)定義只能被它定義的子元素所看見。
【例5.2】 關(guān)于books.xml模式定義的完全例子,代碼如源程序code5_2.xsd所示。
符合某個(gè)模式的文檔稱為實(shí)例。實(shí)例可以根據(jù)特定的模式進(jìn)行驗(yàn)證。需要聲明XML文檔的Schema實(shí)例名稱空間(xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”),并把名稱空間映照到前綴xsi。實(shí)例與模式之間有多對(duì)多的關(guān)系。1個(gè)模式可以描寫多個(gè)有效的實(shí)例(通過使用不同的根元素類型來實(shí)現(xiàn)),一樣,1個(gè)實(shí)例也能夠被多個(gè)模式描寫。例如1個(gè)實(shí)例可能具有多個(gè)模式,它們有不同的驗(yàn)證級(jí)別。其中1個(gè)模式可能只驗(yàn)證結(jié)構(gòu),而另外一個(gè)模式則根據(jù)數(shù)據(jù)類型來檢查每個(gè)數(shù)據(jù)項(xiàng)。
1. Schema的作用
Schema文檔用來驗(yàn)證XML文檔的正確性,用來判斷實(shí)例是不是符合模式中所描寫的所有束縛,觸及到檢查實(shí)例中所有的元素和屬性。
Schema主要檢驗(yàn)以下內(nèi)容:
(1) 驗(yàn)證數(shù)據(jù)的顯示格式是不是正確及是不是超越值的范圍;
(2) 驗(yàn)證所有必須的信息都存在;
(3) 確保不同使用者對(duì)文檔理解的方式相同。
除對(duì)XML文檔的驗(yàn)證外,Schema文檔還在1定程度上擴(kuò)充實(shí)例:
(1) 為元素和屬性添加默許值和固定值;
(2) 使具有簡單類型的元素和屬性值中的空白符規(guī)范化。
2. Schema的援用
1個(gè)模式可能由多個(gè)模式文檔構(gòu)成。多個(gè)模式文檔通過包括或?qū)霗C(jī)制來構(gòu)成模式,當(dāng)其他模式文檔與主模式文檔具有相同的目標(biāo)名稱空間時(shí),需要使用包括;當(dāng)模式文檔之間各自具有不同的目標(biāo)名稱空間時(shí),需要使用導(dǎo)入。下面的例子建立1個(gè)單獨(dú)用來驗(yàn)證實(shí)例的模式文檔。
【例5.3】 關(guān)于多個(gè)模式文檔通過包括實(shí)現(xiàn)定義的例子,代碼如源程序code5_3.xsd所示。
要驗(yàn)證XML文檔,必須指定Schema文檔的位置。模式的位置可以利用帶著名稱空間模式的xsi:schemaLocation屬性和不帶名稱空間XML模式的xsi:noNamespace SchemaLocation 屬性來指定,它們位于根/頂級(jí)元素中或XML文檔的任何其他元素中。
當(dāng)Schema文檔不包括targetNamespace屬性時(shí),應(yīng)當(dāng)通過XML文檔根元素的noNamespace SchemaLocation屬性及W3C的Schema實(shí)例名稱空間(xmlns:xsi=“http://www.w3.org /2001/XML Scheam-instance”)來援用XML Schema文件。針對(duì)上面的實(shí)例修改以下:
但是,如果Schema文檔包括了1個(gè)targetNamespace 屬性,在XML文檔中就將通過schemaLocation屬性而不是noNamespaceSchemaLocation屬性來援用Schema文檔。而且,這個(gè)屬性所指定的值必須是完全的。它需要包括以空格分開的兩部份,前1部份是URI,這個(gè)URI與Schema文檔的targetNamespace屬性內(nèi)部援用的URI是1致的;后1部份是Schema文件的完全路徑及名稱。另外,XML文檔的根元素也必須聲明Schema實(shí)例名稱空間(xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”)。Schema文檔以下所示:
則修改上面的實(shí)例為
元素是創(chuàng)建XML文檔的主要構(gòu)建材料。在W3C XML Schema中,元素通過使用element元素實(shí)現(xiàn)。元素聲明用于給元素指定元素類型名稱、內(nèi)容和數(shù)據(jù)類型等屬性。在XSDL中,元素聲明可以是全局的,也能夠是局部的。
在schema文檔中必須定義1個(gè)且只能定義1個(gè)schema根元素。根元素不但表明了文檔類型,而且還包括模式的束縛、XML模式名稱空間的定義,其他名稱空間的定義、版本信息、語言信息和其他1些屬性。定義以下:
其中name屬性指定Schema名稱,也能夠不需要。xmlns指定所屬名稱空間,緊跟在后面的xsd則是該名稱空間的名稱,名稱空間http://www.w3.org/2001/XMLSchema被映照到xsd前綴,在后面將詳細(xì)說明名稱空間。
XSD中的元素是利用element來聲明的。其中name屬性是元素的名字,type屬性是元素值的類型,在這里可以是XML Schema中內(nèi)置的數(shù)據(jù)類型或其他類型。具體定義格式以下:
name是元素類型的名稱,必須是以字母或下劃線開頭,而且只能夠包括字母、數(shù)字、下劃線、連接符及句號(hào)。type屬性是必要的,說明元素的數(shù)據(jù)類型。
下面的例子定義全局元素聲明author,為簡單字符串類型。
與以上文檔對(duì)應(yīng)的有效XML文檔以下:
在元素的定義中還有兩個(gè)屬性:minOccurs和maxOccurs。其中minOccurs定義了該元素在父元素中出現(xiàn)的最少次數(shù)(默許為1,值為大于等于0的整數(shù)),maxOccurs定義了該元素在父元素中出現(xiàn)的最屢次數(shù)(默許為1,值為大于等于0的整數(shù))。在maxOccurs中可以把值設(shè)置為unbounded,表示對(duì)元素出現(xiàn)的最屢次數(shù)沒有限制。
表示元素author的類型為string,出現(xiàn)的次數(shù)最少為0(就是可選),最多不限制。
1般來講,如果元素聲明出現(xiàn)在Schema文檔的頂級(jí)結(jié)構(gòu)中,也就是說,它的父元素是schema,那末這些元素為全局元素。
相反,局部元素聲明只出現(xiàn)在復(fù)雜類型定義的內(nèi)部,局部元素聲明只在該類型定義中使用,而不被其他復(fù)雜類型援用或在替換組中使用。不同的復(fù)雜類型,可以有相同元素類型名稱的局部元素。
【例5.4】 顯示title、author和price3種局部元素聲明的模式文檔,代碼如源程序code5_4.xsd所示。
默許值和固定值通過給空元素增加值的方式來擴(kuò)大實(shí)例。如果文檔中存在空的元素,模式處理器根據(jù)模式文檔的定義,會(huì)插入默許值或固定值。在XSDL中,默許值和固定值分別通過default和fixed屬性設(shè)置。兩個(gè)屬性只能出現(xiàn)其中之1,由于它們是互斥的。
如果元素為空,就填入默許值。下例中,聲明了city元素,并指定了默許值為“佚名”。
必須注意的是,元素聲明中“空”的定義根據(jù)數(shù)據(jù)類型不同而有所不同。某些數(shù)據(jù)類型允許空值,包括string等。任何允許空字符串值的類型,元素都不會(huì)認(rèn)為是空的,從而對(duì)字符串類型元素,默許值不會(huì)被填充。相反,integer數(shù)據(jù)類型的空元素通常會(huì)被認(rèn)為是空的,從而將填入默許值。另外,如果元素的xsi:nil屬性被設(shè)置為true,那末就不會(huì)插入它的默許值。
元素的默許值行動(dòng)見表5⑴。
固定值與默許值在相同的情況下添加,它們的差別僅在于如果元素具有1個(gè)值,則該值必須和固定值相等。當(dāng)模式解析器肯定元素值和固定值實(shí)際上是不是相等時(shí),會(huì)斟酌到元素的數(shù)據(jù)類型。price元素的數(shù)據(jù)類型為integer,所以整數(shù)1的所有情勢在實(shí)例中都會(huì)被接受,包括01、+1和周圍包括空白符的1。相反,對(duì)author元素具有數(shù)據(jù)類型為string,字符串“01”是無效的,由于與字符串“1”其實(shí)不相等。
依照以上定義,元素的固定值行動(dòng)見表5⑵。
援用是利用element元素的ref屬性實(shí)現(xiàn)的。主要適用于避免在文檔中屢次定義同1個(gè)元素,應(yīng)當(dāng)將常常使用的元素定義為根元素的子元素,即為全局元素,這樣方便在文檔的任何地方援用它。如每本書籍都有作者,其他產(chǎn)品也會(huì)有作者,因此可以把a(bǔ)uthor屬性聲明為全局元素,供文檔中多處援用。
【例5.5】 援用元素定義的模式文檔,代碼如源程序code5_5.xsd所示。
在這里還可以為某個(gè)定義的元素起1個(gè)別名,主要是利用element元素中的substitutionGroup屬性實(shí)現(xiàn)的。
方法以下:
以上文檔對(duì)應(yīng)的有效XML文檔以下:
或:
屬性聲明用于命名屬性并使之與某個(gè)特定的簡單類型相干聯(lián)。在XSDL中,實(shí)現(xiàn)的方法是使用attribute元素。在XML Schema文檔中可以依照定義元素的方法定義屬性,但受限制的程度較高。它們只能是簡單類型,只能包括文本,且沒有子屬性。屬性是沒有順序的,而元素是有順序的。
使用屬性10分簡練,元素的功能比屬性強(qiáng)大,但在某些場合屬性是非常有用的。通常,對(duì)元數(shù)據(jù)使用屬性,而對(duì)數(shù)據(jù)則使用元素。如用屬性描寫單位、語言或元素值的時(shí)間相依性。
定義屬性的方法以下:
該語句定義了1個(gè)名為isbn的屬性,它的值必須是1個(gè)字符類型。
屬性也分全局和局部屬性。全局聲明的屬性是schema元素的子元素,在模式文檔中必須是唯1的。復(fù)雜類型的元素,使用ref屬性通過名稱來援用屬性。局部屬性聲明只出現(xiàn)在復(fù)雜類型定義中,它們僅能在類型定義中使用,而不能被其他類型重用。下面的例子顯示了兩個(gè)屬性——isbn和amount 的全局聲明,然后定義了1個(gè)復(fù)雜類型,使用ref屬性通過名稱來援用這兩個(gè)屬性。
use屬性用于唆使屬性是必須的還是可選的,它出現(xiàn)在屬性援用而不是屬性聲明中,由于它關(guān)系到屬性在復(fù)雜類型中的出現(xiàn),而不是屬性本身。上面的例子定義的是全局的屬性定義方式,如果要在復(fù)雜類型里聲明屬性,可以參照下面的例子:
上面的例子描寫了isbn和amount兩個(gè)屬性的局部聲明,它們完全出現(xiàn)在復(fù)雜類型的定義中。局部聲明的屬性名稱,作用范圍僅限于復(fù)雜類型內(nèi),在同1個(gè)復(fù)雜類型定義中,兩個(gè)屬性使用相同的限定名稱是非法的。只有當(dāng)屬性會(huì)被多個(gè)名稱空間的多個(gè)元素聲明使用到時(shí),才提倡將該屬性聲明為全局屬性。
所有的屬性聲明都把屬性指定為某種簡單類型。所有的屬性都具有簡單類型而不是復(fù)雜類型,由于它們本身不能有子元素和屬性。
屬性聲明有3種方式:
(1) 在屬性聲明中通過用type屬性指定命名簡單類型。它可以是內(nèi)置類型,也能夠是用戶自定義類型。
(2) 通過指定simpleType子屬性來指定匿名類型。
(3) 既沒有type屬性,又沒有simpleType子屬性,從而不指定特定類型。在這類情況下,屬性的類型為anySimpleType,它可以具有任何值,只有它是結(jié)構(gòu)公道的XML文檔。
下例顯示4個(gè)屬性的聲明,采取了不同的類型指定方法。定義了grade屬性并賦予gradeType類型,amount屬性指定了內(nèi)置類型integer,同時(shí)使用內(nèi)嵌的匿名簡單類型來聲明bookcategory屬性,anything屬性沒有指定特定的類型。
對(duì)屬性來講,也能夠通過默許值和固定值的方式增加未出現(xiàn)的屬性來擴(kuò)充實(shí)例。定義和擴(kuò)充的方式與元素1致。在XSDL中,默許值和固定值分別通過default和fixed屬性設(shè)置。兩個(gè)屬性只能出現(xiàn)其中之1,由于它們是互斥的。
如果屬性在元素中默許,它的默許值將會(huì)被填入。如果屬性出現(xiàn),且包括任意值,它將保持該值不變。下面的例子顯示了book元素的聲明,它包括1個(gè)amount屬性,該屬性被指定了默許值。
固定值與默許值在基本1樣的情況下被插入,區(qū)分在于,其值應(yīng)和固定值相等。同時(shí)也會(huì)斟酌屬性的類型。
W3C XML Schema可以把XML文檔中的元素聲明為特定的類型,準(zhǔn)予解析器檢查文檔的內(nèi)容及其結(jié)構(gòu)。XML Schema定義了兩種主要的數(shù)據(jù)類型:預(yù)定義簡單類型和復(fù)雜類型。這兩種數(shù)據(jù)類型之間的主要區(qū)分是復(fù)雜類型可以像數(shù)據(jù)1樣包括其他元素而簡單類型則只能包括數(shù)據(jù)。簡單類型給予了XML Schema低級(jí)類型檢查能力。
元素和屬性聲明都可使用簡單類型來描寫數(shù)據(jù)類型。
1. 簡單類型的種類
原子類型(不可分割的類型,如string、integer等系統(tǒng)內(nèi)建的類型)、列表類型、聯(lián)合類型合起來統(tǒng)1稱為簡單類型。XML Schema具有低級(jí)類型檢查能力,允許把元素定義為表5⑶中的任何類型之1。賦予簡單類型的元素具有字符類型內(nèi)容,但沒有子元素或?qū)傩浴?
(1) 原子類型具有不可分割的值,如10和large。
(2) 列表類型的值為用空格符隔開的原子值列表,如10 large 2
(3) 聯(lián)合類型的值可以是原子值,也能夠是列表值。它們的區(qū)分在于該類型的有效值集是兩個(gè)或多個(gè)其他簡單類型值空間的聯(lián)合。如要對(duì)學(xué)生的成績?cè)u(píng)定等級(jí),可以定義1個(gè)聯(lián)合類型,它允許的值既可以是0~100的整數(shù),也能夠是優(yōu)、良、合格或不合格。
在前面1些例子中,有幾個(gè)元素和屬性被聲明為簡單類型。其中1些簡單類型如 string 和integer是XML Schema中內(nèi)置的類型,其他的1些則是源于(如果使用對(duì)象技術(shù)的語言就是繼承)內(nèi)置的類型。
除此以外,新的簡單類型可以通過從現(xiàn)有的簡單類型(內(nèi)置的簡單類型和源于內(nèi)置簡單類型的簡單類型)引出定義。通常,通太重新束縛1個(gè)現(xiàn)有的簡單類型來引出1個(gè)新的簡單類型。換句話說,新類型的合法值范圍是現(xiàn)有類型的值范圍的子集。使用simpleType元夙來定義和命名新的簡單類型,使用restriction元夙來指出現(xiàn)有的基類型,并且用它來標(biāo)識(shí)束縛值范圍的細(xì)節(jié)。
假定希望建立1個(gè)新的整數(shù)類型稱為myInteger,它的值范圍為10000~99999。那末定義應(yīng)當(dāng)基于簡單類型integer,然后定義它的值范圍為10000~99999。為了定義myInteger,這樣來束縛integer的范圍,示例以下:
這個(gè)例子顯示了由1個(gè)基本類型定義和兩個(gè)值域區(qū)間方面描寫的組合,通過這3個(gè)要素對(duì)myInteger實(shí)行定義。
2. 簡單類型的命名定義
簡單類型既可以為命名簡單類型又可以為匿名簡單類型。命名簡單類型總是在全局定義的,而且要求在模式的數(shù)據(jù)類型中具有唯1名稱。類型的名稱必須為XML無冒號(hào)名稱,即必須以字母或下劃線開始,只能包括字、數(shù)字母、下劃線、連字符和句點(diǎn)。如上面的例子,簡單類型名為myInteger。
這類類型的模式構(gòu)造非常直接了當(dāng),但有些不實(shí)用。特別是如果定義了許多只利用1次而且包括非常少束縛的類型,在這類情況下,1個(gè)類型應(yīng)當(dāng)能夠被更簡單的定義。這樣的簡單定義通常的情勢是1個(gè)省略了名稱和外部援用開消的匿名類型。
在下面的示例中,publish元素聲明使用了匿名類型定義。1般來講,通過元素中是不是包括“type=”這個(gè)屬性可以判斷匿名屬性定義(或是匿名元素定義)。如果出現(xiàn)無名稱的類型定義,也能夠認(rèn)為是匿名屬性(元素)定義。
簡單類型定義時(shí),都是通過restriction元夙來定義限制,通過base屬性來規(guī)定1種基類型。在restriction內(nèi),可以任何順序指定任何面(facet),來對(duì)類型取值進(jìn)1步限制。根據(jù)面的不同,這個(gè)元素或?qū)傩跃哂胁煌挠行е怠ML Schema面的定義見表5⑷。
對(duì)每一個(gè)內(nèi)置的原子類型來講,都有1套定義時(shí)可用的面。如果某個(gè)面適用于某種原子類型,那末也適用于由該類型派生的簡單類型。這里有必要舉例說明枚舉的簡單類型定義,下面的例子定義了1個(gè)簡單類型category,用于說明書籍的種別。
1些用于描寫的參數(shù)能夠被利用到列表類型的定義中,它們是length、minLength、maxLength和enumeration。舉例來講,如果想定義1個(gè)列表類型,這個(gè)列表類型正好包括了6個(gè)分類項(xiàng)名。首先從category類型定義1個(gè)新的列表類型,稱為cateList,然后通過限制cateList導(dǎo)出只有3個(gè)項(xiàng)的threeBookCate類型。具體的定義以下:
類型為threeBookCate的元素必須有3個(gè)項(xiàng),它們中的每個(gè)項(xiàng)必須是1個(gè)枚舉類型category的原子類型(枚舉類型將在后面的章節(jié)中介紹),在示例后半部份的實(shí)例文檔中就是1個(gè)具體的利用例子。
需要注意的是,從原子類型string可以導(dǎo)出1個(gè)列表類型,但是,在1個(gè)string中或許會(huì)帶有空格,而空格在1個(gè)列表類型實(shí)例中是作為分隔符使用的,因此當(dāng)在使用基類型為string的列表類型時(shí),應(yīng)當(dāng)格外謹(jǐn)慎。舉例來講,假定定義了1個(gè)length取值為3的列表類型,同時(shí)這個(gè)列表類型基于類型string。下面由3個(gè)元素這樣組成的列表是合法的Asia Europe Africa;而由3個(gè)元素這樣組成的列表是不合法的Asia Europe Latin America。即便Latin America在列表外可以作為單獨(dú)的1個(gè)字符串存在,但當(dāng)它包括在列表中時(shí),在Latin和America之間的空格使得第4個(gè)項(xiàng)被有效地生成了,因爾后面的例子不符合只有3個(gè)項(xiàng)的列表類型定義。
5. 聯(lián)合類型
利用原子類型和列表類型,1個(gè)元素或?qū)傩缘闹悼梢詾?個(gè)或多個(gè)原子類型(列表類型)的實(shí)例。與之相比較,1個(gè)聯(lián)合類型(Union Type)包括了多個(gè)原子類型或列表類型,而利用了聯(lián)合類型的元素或?qū)傩裕鼈兊闹悼梢允锹?lián)合類型中所包括的這些原子類型或列表類型中的任何1個(gè)類型實(shí)例。為了說明這1點(diǎn),建立1個(gè)用于表示學(xué)生成績的由評(píng)定等級(jí)或數(shù)字列表的聯(lián)合類型。gradeUnion聯(lián)合類型由1個(gè)原子類型和1個(gè)列表類型構(gòu)成。
上一篇 HTTP詳解