多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > htmlcss > XML------XML文檔類型定義(Schema結構)

XML------XML文檔類型定義(Schema結構)

來源:程序員人生   發布時間:2016-06-30 13:12:11 閱讀次數:3519次

XML Schema結構

 5.1 Schema概述
XML Schema是2001年5月正式發布的W3C的推薦標準,經過數年的大范圍討論和開發如今終究塵埃落定,成為全球公認的XML環境下首選的數據建模工具。
使用DTD雖然帶來較大的方便,但是,DTD存在1些缺點:1是它用不同于XML的語言編寫,需要不同的分析器技術。這增加了工具開發商的負擔,下降了軟件瘦身的可能性,另外開發人員需要多學1門語言及其語法。而XML Schema是按標準XML規則編寫的,更容易掌握。2是DTD不支持名稱空間。隨著大部份的數據處理日趨以XML為中心,信息的相互聯系變得日趨普及與深入,名稱空間作用也將凸現。3是DTD在支持繼承和子類方面的局限性。由于面向對象技術的出現,對繼承和子類的支持已成為軟件技術領域的主流概念。最后,DTD沒有數據類型的概念,沒法對特定元素施加數據類型,對強迫性結構化無計可施,例如,如何規定名為Date的數據必須包括有效值。
這些就要依托XML Schema了。XML Schema不但可以定義XML文檔的結構而且還允許束縛文檔的內容,這不同于DTD。另外,1個 XML Schema本身就是1個XML文檔,其基于標簽的語法比DTD中的特殊字符要清楚多了。XML Schema正是針對這些DTD的缺點而設計的,它完全使用XML作為描寫手段,具有很強的描寫能力、擴大能力和處理保護能力。
XML Schema是用1套預先規定的XML元素和屬性創建的,這些元素和屬性定義了文檔的結構和內容模式。
XML Schema也是Web Services技術中需要使用的1個基本工具,但是其實不是XML Schema的所有特性都會被廣泛地使用,因此,本書將不對XML Schema規范做系統的介紹。目前主要有兩種重要的模式:Microsoft XML Schema和W3C XML Schema,本章主要討論W3C XML Schema。
在下面的例子中,通過使用出現在Schema元素中的名稱空間聲明xmlns:xsd= “http://www.w3.org/2001/XMLSchema”,使得模式文檔中的每個元素都有1個與XML Schema名稱空間相干聯的名稱空間前綴xsd。雖然在語法上,可使用任意的前綴情勢,但是,名稱空間前綴xsd被約定用于表示XML Schema名稱空間。由于使用一樣的前綴,所以一樣的關聯就會出現在內置的簡單類型的名字中,例如xsd:string。這類情勢關聯的目的是用來表示當前的元素或簡單類型屬于XML Schema語言的內置定義,而不屬于模式文檔作者自己的辭匯表。為了在這里清楚并且簡單地表示,僅提及元素的名字和簡單類型名,而疏忽它們的前綴xsd。
                                                                                                                               
                                                                                                                               
                                                                                                                               
                                                                                                                      5.2 Schema的格式和使用
1個XSDL(XML Schema Definition Language)文檔由元素、屬性、名稱空間和XML文檔中的其他結點構成,并且最少要包括:schema根元素、XML模式名稱空間的定義和元素定義。
5.2.1 簡單實例
【例5.1】 關于書籍信息的XML文檔,代碼如源程序code5_1.xml所示。



3國演義
羅貫中
80.00
滾滾長江東逝水,浪花淘盡英雄。是非成敗轉頭空。青山照舊在,幾度夕陽紅。白發漁樵江渚上,慣看秋月春風。1壺濁酒喜相逢。古今多少事,都付笑談中。

經典好書

文藝出版社
1998.10

如何寫這個XML文檔的Schema呢?可以簡單地依照它的結構來定義它的每一個元素。首先加入1個xsd:schema元素。

每一個Schema文檔都是從schema元素開始,并且只能有1個,用以控制Schema所使用的名稱空間和另外幾個選項,現在的Schema標準有好幾種,這里決定它所采取的標準,因此是非常重要的。
對應著XML文檔的book元素,一樣也定義1個名為book的元素(element)。由于這個元素有屬性(attributes)和非文本的子元素(non-text children),所以認為它是1個復雜類型(complexType)。而對簡單類型,只能有值,不能有子元素或屬性。同時還注意到book元素下的子元素,都依照1定的順序排列,因此使用順序元素(sequence element)來描寫。


順序元素(sequence element)是1個定義子元素排列順序的元素,在下面的章節,還將介紹其他類似的元素,如選擇(choice)和全選(all)。
接著定義title和author,都是xsd:string類型的簡單元素,由于沒有屬性(attributes)或子元素。xsd:string是1個已在名域中預定義了的XML Schema類型中的1個。




接著,來處理publish元素,它也是1個復雜類型,注意它的基數的定義。


同其他Schema定義語言不1樣,W3C XML Schema允許定義1個元素的使用基數,能指定元素的minOccurs(最小數)和maxOccurs(最大數)。這里設置maxOccurs為unbounded,這意味著能有任意多的publish元素。這兩個屬性的默許值都是1。下面,用一樣的方法定義其他的子元素。


下面封閉complexType和element等元素。


這樣publish元素就完成了,然后封閉book的sequence元素。


現在,聲明book元素的屬性,通常是在最后這么做。這樣做沒有甚么特別的緣由,只不過W3C XML Schema工作組認為在元素后定義屬性感覺更加自然。


最后,封閉所有剩下的元素。


至此,1個Schema已完成了。其中,最關鍵的在于根據文檔的上下關系來定義每個元素和屬性,并且允許有多個同名元素帶有不同的內容。為了這個目的,W3C XML Schema被設計成1種有作用域的語言,它的每個定義只能被它定義的子元素所看見。
【例5.2】 關于books.xml模式定義的完全例子,代碼如源程序code5_2.xsd所示。
























5.2.2 Schema的使用
符合某個模式的文檔稱為實例。實例可以根據特定的模式進行驗證。需要聲明XML文檔的Schema實例名稱空間(xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”),并把名稱空間映照到前綴xsi。實例與模式之間有多對多的關系。1個模式可以描寫多個有效的實例(通過使用不同的根元素類型來實現),一樣,1個實例也能夠被多個模式描寫。例如1個實例可能具有多個模式,它們有不同的驗證級別。其中1個模式可能只驗證結構,而另外一個模式則根據數據類型來檢查每個數據項。
1. Schema的作用
Schema文檔用來驗證XML文檔的正確性,用來判斷實例是不是符合模式中所描寫的所有束縛,觸及到檢查實例中所有的元素和屬性。
Schema主要檢驗以下內容:
(1) 驗證數據的顯示格式是不是正確及是不是超越值的范圍;
(2) 驗證所有必須的信息都存在;
(3) 確保不同使用者對文檔理解的方式相同。
除對XML文檔的驗證外,Schema文檔還在1定程度上擴充實例:
(1) 為元素和屬性添加默許值和固定值;
(2) 使具有簡單類型的元素和屬性值中的空白符規范化。

  1. Schema的援用
    1個模式可能由多個模式文檔構成。多個模式文檔通過包括或導入機制來構成模式,當其他模式文檔與主模式文檔具有相同的目標名稱空間時,需要使用包括;當模式文檔之間各自具有不同的目標名稱空間時,需要使用導入。下面的例子建立1個單獨用來驗證實例的模式文檔。
    【例5.3】 關于多個模式文檔通過包括實現定義的例子,代碼如源程序code5_3.xsd所示。


xmlns=”http://example.org/ord”
targetNamespace=”http://example.org/ord”>



要驗證XML文檔,必須指定Schema文檔的位置。模式的位置可以利用帶著名稱空間模式的xsi:schemaLocation屬性和不帶名稱空間XML模式的xsi:noNamespace SchemaLocation 屬性來指定,它們位于根/頂級元素中或XML文檔的任何其他元素中。
當Schema文檔不包括targetNamespace屬性時,應當通過XML文檔根元素的noNamespace SchemaLocation屬性及W3C的Schema實例名稱空間(xmlns:xsi=“http://www.w3.org /2001/XML Scheam-instance”)來援用XML Schema文件。針對上面的實例修改以下:


xsi:noNamespaceSchemaLocation=”books.xsd”
isbn=”0⑺64⑸8007⑻”>

但是,如果Schema文檔包括了1個targetNamespace 屬性,在XML文檔中就將通過schemaLocation屬性而不是noNamespaceSchemaLocation屬性來援用Schema文檔。而且,這個屬性所指定的值必須是完全的。它需要包括以空格分開的兩部份,前1部份是URI,這個URI與Schema文檔的targetNamespace屬性內部援用的URI是1致的;后1部份是Schema文件的完全路徑及名稱。另外,XML文檔的根元素也必須聲明Schema實例名稱空間(xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”)。Schema文檔以下所示:

targetNamespace=”http://tempuri.org/book”>

則修改上面的實例為


xsi:schemaLocation=”http://tempuri.org/book book.xsd”
xmlns=”http://tempuri.org/book”
isbn=”0⑺64⑸8007⑻”>


                                                                    5.3 Schema元素的聲明

元素是創建XML文檔的主要構建材料。在W3C XML Schema中,元素通過使用element元素實現。元素聲明用于給元素指定元素類型名稱、內容和數據類型等屬性。在XSDL中,元素聲明可以是全局的,也能夠是局部的。
5.3.1 schema根元素
在schema文檔中必須定義1個且只能定義1個schema根元素。根元素不但表明了文檔類型,而且還包括模式的束縛、XML模式名稱空間的定義,其他名稱空間的定義、版本信息、語言信息和其他1些屬性。定義以下:



其中name屬性指定Schema名稱,也能夠不需要。xmlns指定所屬名稱空間,緊跟在后面的xsd則是該名稱空間的名稱,名稱空間http://www.w3.org/2001/XMLSchema被映照到xsd前綴,在后面將詳細說明名稱空間。
5.3.2 element元素
XSD中的元素是利用element來聲明的。其中name屬性是元素的名字,type屬性是元素值的類型,在這里可以是XML Schema中內置的數據類型或其他類型。具體定義格式以下:


name是元素類型的名稱,必須是以字母或下劃線開頭,而且只能夠包括字母、數字、下劃線、連接符及句號。type屬性是必要的,說明元素的數據類型。
下面的例子定義全局元素聲明author,為簡單字符串類型。


與以上文檔對應的有效XML文檔以下:


羅貫中

在元素的定義中還有兩個屬性:minOccurs和maxOccurs。其中minOccurs定義了該元素在父元素中出現的最少次數(默許為1,值為大于等于0的整數),maxOccurs定義了該元素在父元素中出現的最屢次數(默許為1,值為大于等于0的整數)。在maxOccurs中可以把值設置為unbounded,表示對元素出現的最屢次數沒有限制。


表示元素author的類型為string,出現的次數最少為0(就是可選),最多不限制。
1般來講,如果元素聲明出現在Schema文檔的頂級結構中,也就是說,它的父元素是schema,那末這些元素為全局元素。
相反,局部元素聲明只出現在復雜類型定義的內部,局部元素聲明只在該類型定義中使用,而不被其他復雜類型援用或在替換組中使用。不同的復雜類型,可以有相同元素類型名稱的局部元素。
【例5.4】 顯示title、author和price3種局部元素聲明的模式文檔,代碼如源程序code5_4.xsd所示。











5.3.3 設置默許值和固定值
默許值和固定值通過給空元素增加值的方式來擴大實例。如果文檔中存在空的元素,模式處理器根據模式文檔的定義,會插入默許值或固定值。在XSDL中,默許值和固定值分別通過default和fixed屬性設置。兩個屬性只能出現其中之1,由于它們是互斥的。
如果元素為空,就填入默許值。下例中,聲明了city元素,并指定了默許值為“佚名”。


必須注意的是,元素聲明中“空”的定義根據數據類型不同而有所不同。某些數據類型允許空值,包括string等。任何允許空字符串值的類型,元素都不會認為是空的,從而對字符串類型元素,默許值不會被填充。相反,integer數據類型的空元素通常會被認為是空的,從而將填入默許值。另外,如果元素的xsi:nil屬性被設置為true,那末就不會插入它的默許值。





元素的默許值行動見表5⑴。
表5⑴ 元素的默許值行動
情 況 填充實例結果 填充之前 填充以后
指定值 保持原始值羅貫中羅貫中
空元素(integer) 填充值30
空元素(string) 沒有填充值
元素為空 沒有填充值

固定值與默許值在相同的情況下添加,它們的差別僅在于如果元素具有1個值,則該值必須和固定值相等。當模式解析器肯定元素值和固定值實際上是不是相等時,會斟酌到元素的數據類型。price元素的數據類型為integer,所以整數1的所有情勢在實例中都會被接受,包括01、+1和周圍包括空白符的1。相反,對author元素具有數據類型為string,字符串“01”是無效的,由于與字符串“1”其實不相等。


依照以上定義,元素的固定值行動見表5⑵。
表5⑵ 元素的固定值行動
有效實例 無效實例
12
0101
+1+1


1
5.3.4 援用元素和替換
援用是利用element元素的ref屬性實現的。主要適用于避免在文檔中屢次定義同1個元素,應當將常常使用的元素定義為根元素的子元素,即為全局元素,這樣方便在文檔的任何地方援用它。如每本書籍都有作者,其他產品也會有作者,因此可以把author屬性聲明為全局元素,供文檔中多處援用。
【例5.5】 援用元素定義的模式文檔,代碼如源程序code5_5.xsd所示。









在這里還可以為某個定義的元素起1個別名,主要是利用element元素中的substitutionGroup屬性實現的。
方法以下:










以上文檔對應的有效XML文檔以下:



羅貫中

或:



string

5.4 Schema的屬性聲明

屬性聲明用于命名屬性并使之與某個特定的簡單類型相干聯。在XSDL中,實現的方法是使用attribute元素。在XML Schema文檔中可以依照定義元素的方法定義屬性,但受限制的程度較高。它們只能是簡單類型,只能包括文本,且沒有子屬性。屬性是沒有順序的,而元素是有順序的。
使用屬性10分簡練,元素的功能比屬性強大,但在某些場合屬性是非常有用的。通常,對元數據使用屬性,而對數據則使用元素。如用屬性描寫單位、語言或元素值的時間相依性。

5.4.1 創建屬性
定義屬性的方法以下:


該語句定義了1個名為isbn的屬性,它的值必須是1個字符類型。
屬性也分全局和局部屬性。全局聲明的屬性是schema元素的子元素,在模式文檔中必須是唯1的。復雜類型的元素,使用ref屬性通過名稱來援用屬性。局部屬性聲明只出現在復雜類型定義中,它們僅能在類型定義中使用,而不能被其他類型重用。下面的例子顯示了兩個屬性——isbn和amount 的全局聲明,然后定義了1個復雜類型,使用ref屬性通過名稱來援用這兩個屬性。







use屬性用于唆使屬性是必須的還是可選的,它出現在屬性援用而不是屬性聲明中,由于它關系到屬性在復雜類型中的出現,而不是屬性本身。上面的例子定義的是全局的屬性定義方式,如果要在復雜類型里聲明屬性,可以參照下面的例子:







rbut
上面的例子描寫了isbn和amount兩個屬性的局部聲明,它們完全出現在復雜類型的定義中。局部聲明的屬性名稱,作用范圍僅限于復雜類型內,在同1個復雜類型定義中,兩個屬性使用相同的限定名稱是非法的。只有當屬性會被多個名稱空間的多個元素聲明使用到時,才提倡將該屬性聲明為全局屬性。
5.4.2 為屬性指派類型
所有的屬性聲明都把屬性指定為某種簡單類型。所有的屬性都具有簡單類型而不是復雜類型,由于它們本身不能有子元素和屬性。
屬性聲明有3種方式:
(1) 在屬性聲明中通過用type屬性指定命名簡單類型。它可以是內置類型,也能夠是用戶自定義類型。
(2) 通過指定simpleType子屬性來指定匿名類型。
(3) 既沒有type屬性,又沒有simpleType子屬性,從而不指定特定類型。在這類情況下,屬性的類型為anySimpleType,它可以具有任何值,只有它是結構公道的XML文檔。
下例顯示4個屬性的聲明,采取了不同的類型指定方法。定義了grade屬性并賦予gradeType類型,amount屬性指定了內置類型integer,同時使用內嵌的匿名簡單類型來聲明bookcategory屬性,anything屬性沒有指定特定的類型。











5.4.3 屬性的默許值和固定值
對屬性來講,也能夠通過默許值和固定值的方式增加未出現的屬性來擴充實例。定義和擴充的方式與元素1致。在XSDL中,默許值和固定值分別通過default和fixed屬性設置。兩個屬性只能出現其中之1,由于它們是互斥的。
如果屬性在元素中默許,它的默許值將會被填入。如果屬性出現,且包括任意值,它將保持該值不變。下面的例子顯示了book元素的聲明,它包括1個amount屬性,該屬性被指定了默許值。




固定值與默許值在基本1樣的情況下被插入,區分在于,其值應和固定值相等。同時也會斟酌屬性的類型。





5.5 Schema的數據類型

W3C XML Schema可以把XML文檔中的元素聲明為特定的類型,準予解析器檢查文檔的內容及其結構。XML Schema定義了兩種主要的數據類型:預定義簡單類型和復雜類型。這兩種數據類型之間的主要區分是復雜類型可以像數據1樣包括其他元素而簡單類型則只能包括數據。簡單類型給予了XML Schema低級類型檢查能力。
5.5.1 簡單類型
元素和屬性聲明都可使用簡單類型來描寫數據類型。
1. 簡單類型的種類
原子類型(不可分割的類型,如string、integer等系統內建的類型)、列表類型、聯合類型合起來統1稱為簡單類型。XML Schema具有低級類型檢查能力,允許把元素定義為表5⑶中的任何類型之1。賦予簡單類型的元素具有字符類型內容,但沒有子元素或屬性。
(1) 原子類型具有不可分割的值,如10和large。
(2) 列表類型的值為用空格符隔開的原子值列表,如10 large 2
(3) 聯合類型的值可以是原子值,也能夠是列表值。它們的區分在于該類型的有效值集是兩個或多個其他簡單類型值空間的聯合。如要對學生的成績評定等級,可以定義1個聯合類型,它允許的值既可以是0~100的整數,也能夠是優、良、合格或不合格。
表5⑶ XML Schema支持的部份簡單類型
內建類型 定 義
string 字符串數據,如”online book shop”
boolean 2元類型的true或false
date 表示日期,格式是ccyy-mm-dd
dateTime 表示當前時間,由日期和時間組成,如11/18/80,10:00am
time 24小時格式的時間可根據時區調理
decimal 任意精度和位數的10進制數,如27.93
integer 整數,如34
float 標準的32位浮點數,如11.87e⑵

在前面1些例子中,有幾個元素和屬性被聲明為簡單類型。其中1些簡單類型如 string 和integer是XML Schema中內置的類型,其他的1些則是源于(如果使用對象技術的語言就是繼承)內置的類型。
除此以外,新的簡單類型可以通過從現有的簡單類型(內置的簡單類型和源于內置簡單類型的簡單類型)引出定義。通常,通太重新束縛1個現有的簡單類型來引出1個新的簡單類型。換句話說,新類型的合法值范圍是現有類型的值范圍的子集。使用simpleType元夙來定義和命名新的簡單類型,使用restriction元夙來指出現有的基類型,并且用它來標識束縛值范圍的細節。
假定希望建立1個新的整數類型稱為myInteger,它的值范圍為10000~99999。那末定義應當基于簡單類型integer,然后定義它的值范圍為10000~99999。為了定義myInteger,這樣來束縛integer的范圍,示例以下:





這個例子顯示了由1個基本類型定義和兩個值域區間方面描寫的組合,通過這3個要素對myInteger實行定義。
2. 簡單類型的命名定義
簡單類型既可以為命名簡單類型又可以為匿名簡單類型。命名簡單類型總是在全局定義的,而且要求在模式的數據類型中具有唯1名稱。類型的名稱必須為XML無冒號名稱,即必須以字母或下劃線開始,只能包括字、數字母、下劃線、連字符和句點。如上面的例子,簡單類型名為myInteger。
這類類型的模式構造非常直接了當,但有些不實用。特別是如果定義了許多只利用1次而且包括非常少束縛的類型,在這類情況下,1個類型應當能夠被更簡單的定義。這樣的簡單定義通常的情勢是1個省略了名稱和外部援用開消的匿名類型。
在下面的示例中,publish元素聲明使用了匿名類型定義。1般來講,通過元素中是不是包括“type=”這個屬性可以判斷匿名屬性定義(或是匿名元素定義)。如果出現無名稱的類型定義,也能夠認為是匿名屬性(元素)定義。








3. 簡單類型的限制
每一個簡單類型都是從另外一個簡單類型派生而來的,則另外一個簡單類型稱為基類型。可以從原子類型,也能夠從用戶定義的簡單類型派生。上面的例子都從內置的原子類型派生成新的簡單類型。所有新的簡單類型都以某種方式限制其基類型的值空間。下面的例子從簡單類型種類例子中定義的myInteger類型進1步限制。





簡單類型定義時,都是通過restriction元夙來定義限制,通過base屬性來規定1種基類型。在restriction內,可以任何順序指定任何面(facet),來對類型取值進1步限制。根據面的不同,這個元素或屬性具有不同的有效值。XML Schema面的定義見表5⑷。
表5⑷ XML Schema面的定義
面 意 義
minExclusive 值必須大于x,相對就有maxExclusive
minInclusive 值必須大于等于x,相對就有maxInclusive
length 值的長度必須等于x
minLength 值的長度必須大于等于x,相對就有maxLength
totalDigits 有效數字的位數必須小于等于x
fractionDigits 小數位數必須小于等于x
whiteSpace 是不是保存、替換或緊縮whitespace,決定于x
enumeration x是1個有效值
pattern x是值可以匹配1個正則表達式
對每一個內置的原子類型來講,都有1套定義時可用的面。如果某個面適用于某種原子類型,那末也適用于由該類型派生的簡單類型。這里有必要舉例說明枚舉的簡單類型定義,下面的例子定義了1個簡單類型category,用于說明書籍的種別。









  1. 列表類型
    除使用簡單類型中描寫的原子類型,XML Schema還定義了其他兩種簡單類型:列表類型和聯合類型。
    列表類型由1組原子類型組成,因此它的每個部份(原子)本身都是成心義的,定義時以空格隔開原子值的列表。舉例來講category是個列表類型。這個類型的元素將是NMTOKEN的列表,不同的NMTOKEN值使用空格分隔,如“小說 散文 傳記”。XML Schema有3個內置的列表類型,它們是NMTOKENS、IDREFS和ENTITIES。
    除使用內置的列表類型以外,還可以通過援用現有的原子類型建立新的列表類型(不可使用現有的列表類型來建立新的列表類型,也不能使用聯合類型來建立新的列表類型)。舉例來講,可以建立1個名為myInteger的列表類型,并在實例文檔中使用它。其中示例的后半部份即為實例文檔中與列表類型listOfMyIntType相1致的實例元素myInt。







20003 15037 95977 95945

1些用于描寫的參數能夠被利用到列表類型的定義中,它們是length、minLength、maxLength和enumeration。舉例來講,如果想定義1個列表類型,這個列表類型正好包括了6個分類項名。首先從category類型定義1個新的列表類型,稱為cateList,然后通過限制cateList導出只有3個項的threeBookCate類型。具體的定義以下:












小說 散文 傳記

類型為threeBookCate的元素必須有3個項,它們中的每個項必須是1個枚舉類型category的原子類型(枚舉類型將在后面的章節中介紹),在示例后半部份的實例文檔中就是1個具體的利用例子。
需要注意的是,從原子類型string可以導出1個列表類型,但是,在1個string中或許會帶有空格,而空格在1個列表類型實例中是作為分隔符使用的,因此當在使用基類型為string的列表類型時,應當格外謹慎。舉例來講,假定定義了1個length取值為3的列表類型,同時這個列表類型基于類型string。下面由3個元素這樣組成的列表是合法的Asia Europe Africa;而由3個元素這樣組成的列表是不合法的Asia Europe Latin America。即便Latin America在列表外可以作為單獨的1個字符串存在,但當它包括在列表中時,在Latin和America之間的空格使得第4個項被有效地生成了,因爾后面的例子不符合只有3個項的列表類型定義。
5. 聯合類型
利用原子類型和列表類型,1個元素或屬性的值可以為1個或多個原子類型(列表類型)的實例。與之相比較,1個聯合類型(Union Type)包括了多個原子類型或列表類型,而利用了聯合類型的元素或屬性,它們的值可以是聯合類型中所包括的這些原子類型或列表類型中的任何1個類型實例。為了說明這1點,建立1個用于表示學生成績的由評定等級或數字列表的聯合類型。gradeUnion聯合類型由1個原子類型和1個列表類型構成。


















組成聯合類型的簡單類型稱為它的成員類型。成員類型必須是簡單類型,不存在復雜類型的聯合。除直接用簡單類型來規定成員類型外,還可使用union元素的memberTypes屬性來規定成員類型。假定已在模式文檔的其他地方定義了gradeType和scoreInteger,改寫上面的例子:







87

當在定義1個聯合類型時,union元素的memberTypes屬性的值包括了聯合類型中所有類型的列表。現在,假定聲明了1個gradeUnion類型的元素,稱為stuScore,stuScore元素有效的實例可參見上面的實例。
另外,對聯合類型而言,還有兩個描寫性質的參數pattern和enumeration也能夠應需要使用。
5.5.2 復雜類型
復雜類型的元素具有子元素和屬性,還可以有字符內容。復雜類型和簡單類型之間最根本的區分就是:復雜類型的內容中可以包括其他元素或屬性,但簡單類型既不能包括子元素,也不能帶有任何屬性。復雜類型有4種不同的內容類型:簡單類型、純元素類型、混合類型及空類型。下例中給出了具有復雜類型的元素:book是帶有屬性的元素、bookinfo是包括子元素的純元素復雜類型、chapter是混合類型的復雜類型元素和內容為空的元素price。它們分別屬于下面要描寫的4種不同的內容類型。


no.1

3國演義
羅貫中

宴桃園豪杰3結義 斬黃巾英雄首立功
話說天下大勢,分久必合,合久必分。

復雜類型由complexType元素創建,同簡單類型1樣,復雜類型可以是命名的,也能夠是匿名的。命名的復雜類型可以被多個元素聲明使用,1般在全局范圍內定義。相反,匿名的復雜類型完全在元素聲明中進行定義,而且只可以被該聲明使用1次。有3種不同的方法:
(1) 單個complexContent子元素,可使用它從1個復雜類型派生出新的復雜類型;
(2) 單個simpleContent子元素,用于從簡單類型派生出復雜類型;
(3) 組(group、all、choice或sequence)加屬性,用于定義1種非派生于特定類型的復雜類型。
1. 內容類型
所謂元素的內容是在標記之間的字符數據和子元素。復雜類型子元素的順序和結構稱為它的“內容模型”。復雜類型的內容類型有4種:簡單內容、純元素內容、混合內容和空內容。內容類型不依賴于屬性,所有這些內容類型都允許有屬性。
簡單內容只允許有字符數據,它沒有子元素。1般說來,簡單類型和具有簡單內容的復雜類型的唯1區分在于后者可以有屬性,以下面的book元素。

no.1

要定義如上所示的book元素,必須按以下方法定義。復雜類型bookType的字符數據內容符合簡單類型string,而且還添加了isbn屬性。






純元素內容只允許有子元素,而沒有字符數據內容。下例顯示了具有純元素內容的bookinfo元素,它有兩個子元素:title和author。


3國演義
羅貫中

可以按以下方式進行定義:





混合內容既允許有字符數據又允許有子元素。常常用于字母和文檔等情勢的自由文本。下例中顯示了具有混合內容的chapter元素。chapter元素中直接包括字符數據和子元素para。

宴桃園豪杰3結義 斬黃巾英雄首立功
話說天下大勢,分久必合,合久必分。

在創建所示的chapter元素類型定義時,需要設置complexType的mixed屬性為true,允許有字符數據內容。mixed的默許值為false。





空內容既不允許有字符數據也不允許有子元素。帶有空內容的元素通常在屬性中具有值。有某些情況下,乃至可以沒有屬性,但空內容的元素存在本身就成心義。如XHTML中的
元素就表示1個新行。


要定義空內容元素的類型時,只需指定屬性,不用做其他內容的說明。




2. 利用組合器控制結構
模式組允許把子元素聲明或援用組合起來,從而構建更成心義的內容模型。模式組共有3種:sequence、choice和all。
sequence組合器,定義了1列元素并且必須依照模式中指定的順序顯示,所有子元素。如果出現的話,都必須依照該順序出現。示例以下。








下面顯示了1些book的有效實例。它的子元素都以正確的順序出現。


3國演義
羅貫中
文藝出版社

choice組合器用來聲明只有1個相容元素必須出現,用于互斥情況。示例以下。








下面的實例都是有效的,每個實例包括1個符合choice組中聲明的子元素。如果出現多個子元素,或根本沒有任何元素出現,那末該實例將是無效的。


3國演義


羅貫中

choice組合器還可以允許任意數量的子元素以任意順序出現。只要通過把choice組的maxOccurs屬性設置為unbounded便可允許子元素以任何順序出現,出現任意次數。另外,為了指定更加高級的內容,sequence和choice可以彼此嵌套,可以進行任意層數的嵌套。









all組合器用來表示符合元素聲明的所有元素都應當出現(以任何順序)且只能出現1次。all組合器與choice和sequence的不同的地方在于:
(1) 只能包括元素聲明和援用,而不能包括其他組。
(2) 不能出現屢次。對所包括的每一個子元素,maxOccurs必須為1,而minOccurs只可以為0或1。不能出現在其他模式組中。all組必須在復雜類型的最高層。
示例以下。









根據上面的定義,下面顯示了book的兩個有效實例。price和publisher元素定義了minOccurs等于0,因此可以不出現。


3國演義
羅貫中
文藝出版社
30


3國演義
羅貫中

5.6 Schema的名稱空間

名稱空間是XML Schema中的重要部份,它提供了1種避免元素命名沖突的方法。名稱空間的用處在于為XML中使用的名稱提供1個容器。
5.6.1 命名沖突
XML是可擴大的,而這類擴大不遭到控制。由于XML文檔中使用的元素不是固定的,那末便可能會出現多個不同的XML文檔使用同1個名字來描寫不同類型的元素的情況。而這類情況又常常會致使命名沖突。請看下面兩個例子。
以下XML文檔在table元素中攜帶了水果的信息:






Apples Bananas

以下XML文檔在table元素中攜帶了桌子的信息:


African Coffee Table
80
120

如果上面兩個XML文檔片斷碰巧在1起使用的話,那末將會出現命名沖突的情況。由于這兩個片斷都包括了table元素,而這兩個table元素的定義與所包括的內容又各不相同。
5.6.2 使用前綴解決命名沖突問題
前面的例子中所出現的命名沖突問題就是由于XML的可擴大性致使的,沒有辦法能夠避免任何人以與其他人不兼容的方式對文檔進行擴大。名稱空間的出現就是為了解決這個問題的。名稱空間定義了1個標記的容器,為所有在文檔中使用的標記名稱提供語境。實例文檔中的元素類型或屬性的名稱可能直接與名稱空間關聯,或就屬于某個名稱空間。這樣就能夠避免命名的沖突。因此,可以這樣改造上面的XML文檔,在table元素前面加上前綴。



Apples
Bananas

則家具table的信息變成:


African Coffee Table
80
120

現在已沒有元素命名沖突的問題了,由于這兩個文檔對各自的table元素使用了不同的前綴,table元素在兩個文檔中分別是和。但是,前綴還不能完全解決問題,由于任何人都可以創建前綴,如果兩個文檔創建了相同的前綴,則又出現沖突問題。為了不前綴沖突,可使用以下的前綴聲明。

f=”http://www.example.org/html”
h=”http://www.example.org/furniture”

將統1資源標識符(Uniform Resource Identifier,URI)跟前綴聯系起來。由于URI跟標記或前綴不同,它具有唯1性。這就是名稱空間的解決方法。
5.6.3 使用名稱空間
名稱空間屬性1般放置在元素的開始標記處,從xmlns屬性開始,后面是前綴。其使用語法格式以下:
xmlns:namespace-prefix=”namespace”
具體示例以下:

xmlns:f=”http://www.w3.org/2000/10/XMLSchema”

前綴只是起著名稱空間的代理作用。名稱空間的名稱是URI,而不是前綴,在比較兩個元素時,解析器是根據URI來辨認它們的名稱空間,而不是根據前綴辨認。上面的例子則可以與不同的名稱空間關聯到1起。



Apples
Bananas

下面是攜帶了家具table的信息XML文檔。


African Coffee Table
80
120

5.6.4 URI、URL和URN
名稱空間的聲明將1個全局名稱(URI)跟元素的名稱聯系在1起。URI只作為標識符。僅就作為XML名稱空間來講,URI沒必要是有效的。也就是說,它沒必要指向任何位置。XML名稱空間只將它們作為字符串處理。比較是逐一字符進行的,因此,下面的兩個URI是不同的,雖然指向同1個文檔。

http://www.example.org
http://example.org

而且名稱空間是辨別大小寫的。即便唯一大小寫區分,也會被解析為不同的URI。
大多數的URI都是URL或Internet地址。可能指向網絡上的某個文件、用戶電子郵箱(mailto:branch@example.org)或是新聞組(news:comp.exmaple.xml)。
目前正在開發另外一種情勢的URI,稱為URN(Uniform Resource Name)。二者的區分在于:對地址來講,如果文檔移動了位置,那末地址就失效了,而URN不是地址,它們與文檔的位置無關。URN是用“urn:”前綴構建的,后跟1個前綴表明該URN的類型,最后是值。

urn:isbn: 0⑺64⑸8007⑻

這里ISBN的編號就是URN的實例。每一個ISBN編號都代表了1本書。
5.6.5 名稱空間的作用域
名稱空間聲明可以出現在文檔的任何開始標記中,它的作用域是它在其開始標記中出現的元素和其所有子元素等。


3國演義
羅貫中
80.00
經典好書

文藝出版社
1998.10

上面的示例中聲明了兩個名稱空間,bk是頂層元素聲明的,因此對所有元素都是有效的。ph是為publisher元素聲明的,只對它的子元素有效。但是,如果還有1個book元素,它的子元素publisher使用了ph前綴,則是不合法的名稱空間,由于超越了其作用域。1般來講,最好把所著名稱空間聲明都放到根元素的開始標記中。這樣可以1下子看到文檔的所著名稱空間,對它們的作用域也不會混淆。
5.6.6 在XSDL中使用的名稱空間
1. 目標名稱空間
每個XSDL模式文檔都可以是1個名稱空間,這稱為它的目標名稱空間(Target Namespace)。每一個被全局聲明所聲明和定義的元素、屬性、類型或組等都與該目標名稱空間有關。下例中聲明了http://www.example.org/2005/book的目標名稱空間。

xmlns=”http://www.example.org/2005/book”
targetNamespace=”http://www.example.org/2005/book”>








而下面的例子顯示相應的元素如何出現在1個實例中。

3國演義
羅貫中
80.00

2. XML Schema名稱空間
由于XSDL也是XML文檔,所以名稱空間也適用于它。在XSDL中使用的所有元素:schema、element和simpleType,都在XML Schema名稱空間中,其名稱空間名稱為http://www.w3.org/ 2001/XMLSchema。另外,內置的簡單類型也在這個名稱空間中。最常映照到這個名稱空間的前綴是xsd或xs。如上面的例子,都采取xsd前綴。
3. XML Schema實例名稱空間
XML Schema實例名稱空間是實例中可以出現的4個與模式相干的屬性的獨揚名稱空間,其名稱空間名稱為http://www.w3.org/2001/XMLSchema-instance,1般映照到前綴xsi。當在實例中使用這4個屬性:nil、type、schemaLocation和noNamespaceSchemaLocation時,需要聲明XML Schema實例名稱空間,在實例中它們的名稱必須加前綴。
4. 模式文檔中名稱空間的聲明
為了解析模式文檔的援用,模式文檔必須包括目標名稱空間和XML Schema名稱空間的聲明。可以把XML Schema名稱空間映照到像xsd或xs這樣的前綴,從而使目標名稱空間成為默許名稱空間。這樣由XML Schema定義就顯得非常清楚了,示例以下。

xmlns=”http://www.example.org/2005/book”
targetNamespace=”http://www.example.org/2005/book”>





另外一種方法是把前綴映照到目標名稱空間,并使XML Schema名稱空間成為默許名稱空間。下例顯示了這1方法。聲明中的名稱本身不需要加前綴,由于它們自動成為XML Schema名稱空間的1部份,唯1使用前綴的地方就是對其他組件的援用。如book元素通過限定名稱援用類型BookType。如果不加前綴,那末解析器將在XML Schema名稱空間中尋覓BookType的定義。

xmlns:bk=”http://www.example.org/2005/book”
targetNamespace=”http://www.example.org/2005/book”>






有時,把前綴映照到所著名稱空間也是可以的,這樣全部文檔也非常清晰。

xmlns:bk=”http://www.example.org/2005/book”
targetNamespace=”http://www.example.org/2005/book”>





5.7 使用XML Spy建立Schema文檔

利用前面有關的XML文檔進行簡化,現在使用XML Spy來建立Schema文檔。
【例5.6】 簡化了的書籍XML文檔,代碼如源程序code5_6.xml所示。以此為例,逐漸建立Schema文檔。



3國演義
羅貫中
80.00
滾滾長江東逝水,浪花淘盡英雄。是非成敗轉頭空。青山照舊在,幾度夕陽紅。白發漁樵江渚上,慣看秋月春風。1壺濁酒喜相逢。古今多少事,都付笑談中。


5.7.1 建立根結點
選擇菜單File | New,彈出Create new document 對話框,選擇里面的xsd(XML Schema file),這樣1個空的Schema文檔就會被建立,然后從Schema/WSDL視圖區切換到Grid視圖區,如圖5.1所示。

圖5.1 新建1個Schema文檔

窗體下方的幾個按鈕提供不同的視圖來設計Schema文件。本例選擇的是Grid視圖,可以有許多詳細信息。
接著,單擊左上角的黑3角,編碼方式項enconding默許值為UTF⑻,將其改成GB2312,以便使用中<

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成年视频国产免费观看 | 国产精品5 | 精品一区二区三区高清免费不卡 | 天堂日本岛a | 亚洲一区二区三区四区在线 | a久久久久一级毛片护士免费 | 伊人香焦| 五月婷婷视频在线观看 | 国产欧美综合精品一区二区 | 国产成人精品午夜二三区 | 亚洲一区精品视频在线 | 成 黄 色 激 情视频网站 | 国产爱v| 最近中文字幕更新免费 | 精品亚洲综合在线第一区 | 波多野结衣在线免费观看视频 | 久久影视免费观看网址 | 多人伦交性欧美精品欧 | 一区二区在线看 | 国产精品日韩欧美亚洲另类 | 久久91av | 在线 v亚洲 v欧美v 专区 | 最近中文字幕大全 | 欧美理论片在线观看一区二区 | 精品国产一区二区三区久久 | www.在线免费观看 | 欧美另类z0z000高清 | 亚洲成人伊人网 | 在线看片亚洲 | 欧美午夜精品一区二区三区 | 真人性做爰aa毛片免费视频观看 | 国产成人高清视频 | 国产精品嫩草影院在线观看免费 | 精品一区二区三区免费 | 一级毛片毛片毛片毛毛片 | 五月激情六月丁香 | 日韩一级片免费观看 | 国产尤物在线观看 | 欧美黑人两根巨大挤入 | 亚洲永久在线 | 中文字幕亚洲精品日韩精品 |