XSD是什麼

來源:互聯網
上載者:User

什麼是XML Schema

XML Schema如同DTD一樣是負責定義和描述XML文檔的結構和內容模式。它可以定義XML文檔中存在哪些元素和元素之間的關係,並且可以定義元素和屬性的資料類型。

XML Schema本身是一個XML文檔,它符合XML文法結構。可以用通用的XML解析器解析它。



為什麼要使用Schema

我們前面已經使用DTD來定義一個XML的結構和資料類型,那為什麼還要Schema呢?

因DTD有著不少缺陷:

1) DTD是基於Regex的,描述能力有限;
2) DTD沒有資料類型的支援,在大多數應用環境下能力不足;
3) DTD的約束定義能力不足,無法對XML執行個體文檔作出更細緻的語義限制;
4) DTD的結構不夠結構化,重用的代價相對較高;
5) DTD並非使用XML作為描述手段,而DTD的構建和訪問並沒有標準的編程介面,無法使用標準的編程方式進行DTD維護。

而XML Schema正是針對這些DTD的缺點而設計的,XML Schema的優點:

1) XML Schema基於XML,沒有專門的文法
2) XML可以象其他XML檔案一樣解析和處理
3) XML Schema支援一系列的資料類型(int、float、Boolean、date等)
4) XML Schema提供可擴充的資料模型。
5) XML Schema支援綜合命名空間
6) XML Schema支援屬性群組。



一個簡單的XML Schema文檔

在這個Schema裡面定義了一個元素:quantity,它的類型是nonNegativeInteger(非負整數),xmlns是Schema的命名空間,這在前面第3部分已經敘述過了。

下面的XML片段是合法的:

<quantity>5</quantity>

下面的XML片段是非法的:

<quantity>-4</quantiy>


Schema中的類型

Schema中主要包括三種組件:元素(element)、屬性(attribute)、注釋(notation)。

這三種基本的組件還能組合成以下的組件:

a)類型定義組件: 簡單類型和複合類型
b)組組件
c)屬性群組組件



簡單類型

XML Schema中定義了一些內建的資料類型,這些類型可以用來描述元素的內容和屬性值。

一個元素中如果僅僅包含數字、字串或其他資料,但不包括子項目,這種被稱為簡單類型。

如同圖中元素quantity就是一個簡單類型。它的元素內容必須是非負整數,不包括任何屬性和子項目。

<quantity>some</quantity>


所有內建的簡單類型

原始類型

string,boolean,decimal,float,double,duration
datetime,time,date,gYearMonth,gYear,gMonthDay,
dDay,gMonth,hexBinary,base64Binary,any URI,QName
NOTATION

衍生類型(括弧中為基底類型)

normalizedString(string),language(tonken),token(normalizedString)
NMTOKEN(token),Name(token),NCName(Name),ID(NCName),IDREF(NCName)
IDREFS(list of IDREF),ENTITY(NCName),ENTITIES(list of ENTITY)
integer(decimal),nonPositiveInteger(integer),
negativeInteger(noPositiveInteger),long(integer),int(long),
short(int),byte(short),nonNegativeInteger(integer)
unsignedLong(nonNegativeInteger),unsignedInt(unsignedLong),
unsignedShort(unsignedInt),unsignedByte(unsignedShort),
positiveInteger(nonNegativeInteger)


建立簡單類型

圖中我們先建立了一個簡單類型:quantityType,它是從integer繼承過來的,minInclusive和maxInclusive定義了它的最小值2和最大值5。最後我們定義元素quantity的類型為quantityType。

正確:<quantity>3</quantity>
錯誤:<quantity>10</quantity>
<qauntity>aaa</quantity>

使用restriction我們可以限制只能接受一定數值或者只能接受一定文字,

基本方面:equal,ordered,bounded,cardinality,numeric
限制方面:length,minLength,maxLength
pattern,enumeration
whiteSpace
maxInclusive,maxExclusive,minInclusive,minExclusive
totalDigits,fractionDigits


簡單類型的例子 1

這個SKU的類型的取值:3個數字後面根著一個連字號接著跟著兩個大寫的英文字母。

pattern後面跟的是Regex。有關Regex的文法請參閱其他書籍。

正確:<ourSKU>123-AB</ourSKU>
錯誤:<ourSKU>abc-AB</ourSKU>
<ourSKU>123-ab</ourSKU>


簡單類型的例子 2

這是一個用來描述美國州名的類型USState,通過enumeration來列出所有州名,取值時就只能取裡面列出的州名。

<!-- and so on ...-> 這是一個備註陳述式。

正確:<statename>AK</statename>
錯誤:<statename>Alaska</statename>


清單類型

list可以用來定義清單類型,listOfIntType這個類型被定義為一個Integer的列表,元素listOfMyInt的值可以幾個整數,他們之間用空格隔開。

正確: <listOfMyInt>1 5 15037 95977 95945</listOfMyInt>
錯誤: <listOfMyInt>1 3 abc</listOfMyInt>


等位型別

圖中用union來定義了一個等位型別,裡面的成員類型包括USState和listOfMyIntType,應用了等位型別的元素的值可以是這些原子類型或清單類型中的一個類型的執行個體,但是一個元素執行個體不能同時包含兩個類型。

正確:<zips>CA</zips>
<zips>95630 95977 95945</zips>
<zips>AK</zips>
錯誤:<zips>CA 95630</zips>

匿名型別定義

前面我們在定義元素類型時總是先定義一個資料類型,然後再把元素的type設成新定義的資料類型。如果這個新的資料類型只會用一次,我們就可以直接設定在元素定義裡面,而不用另外來設定。中元素quantity的類型就是一個從1到99的整數。

這種新的類型沒有自己的名字的定義方法我們稱之為匿名型別定義。



複合類型

前面我們所講到的都是屬於簡單類型,即元素裡面只有內容,不再包括屬性或者其它元素。接下來我們要讓元素裡麵包含屬性和其它元素,稱之為複合類型。

圖中我們用complexType表示這是一個複合類型(這裡我們是用匿名型別定義的)。simpleContent表示這個元素下面不包括子元 素,extension表示這個元素值是decimal的,attribute來設定它的一個屬性currency,類型為string.

正確:<internationalPrice currency="EUR">423.46</internationalPrice>


混合內容

同樣,我們採用了匿名型別方式來定義一個元素salutation。我們注意到在complexType後面多了一個mixed="true",這表明這是一個混合類型:裡面既有元素本身的內容,又有其它子項目。name元素就是salutation的子項目。

正確:<salutation>Dear Mr.<name>Robert Smith</name>.</salutation>
錯誤:<salutation>Dear Mr.</salutation>

sequence表示子項目出現的順序要和schema裡面的順序一樣。我們在後面還會講到和sequence對應的choice和all兩種方式。



空內容

有的時候元素根本沒有內容,他的內容模型是空。為了定義內容是空的類型,我們可以通過這樣的方式:首先我們定義一個元素,它只能包含子項目而不能包含元素內容,然後我們又不定義任何子項目,依靠這樣的方式,我們就能夠定義出內容模型為空白的元素。

圖中complexConet表示只包含子項目,然後我們定義了兩個屬性currency和value,但是卻不定義任何子項目。

正確:
<internationalPrice currency="EUR" value="/423.46"/>
錯誤:
<internationalPrice currency="EUR" value="/423.46">
Here is a mistake!
</interanationPrice>

還要更簡潔的方法定義:

<xsd:element name="internationalPrice">
<xsd:complexType>
<xsd:attribute name="currency" type="xsd:string"/>
<xsd:attribute name="value" type="xsd:decimal"/>
</xsd:complexType>
</xsd:element>

因為一個不帶有simpleContent 或者complexContent的複合類型定義,會被解釋為帶有類型定義為anyType的complexContent,這是一個預設的速記方法,所以這個簡潔的文法可以在模式處理器中工作。



anyType

一個anyType類型不以任何形式約束其包含的內容。我們可以象使用其他類型一樣使用anyType,第一個語句,這個方式聲明的元素是不受 約束的。所以元素的值可以為423.46,也可以為任何其他的字元序列,或者甚至是字元和元素的混合。實際上,anyType是預設類型,所以上面的可以 被重寫為第二個語句。

如果需要表示不受約束的元素內容,舉例來說在元素包含散文,其中可能需要嵌入標籤來支援國際化的表示,那麼預設的聲明(無約束)或者有些微約束的形式會很合適。



注釋

為了方便其他讀者和應用來完整模式文檔,XML Schema提供了三個元素用來注釋。

annotation
documentation
appinfo

圖中,我們在documentation元素中放置了一個基本的模式描述和著作權資訊,這是放置適合人閱讀的資訊的推薦位置。我們推薦你在任何的documentation元素中使用xml:lang屬性來表示這些描述資訊使用的語言。



構造內容模型

圖中,我們在purchaseOrderType定義中引入兩個元素組定義,購買訂單就可以有兩種選擇來描述地址:第一種是包含彼此獨立的寄送地址和收款地址,第二種情況則是僅包含一個簡單的地址,這個地址即是寄送地址也是收款地址.

對於choice組元素而言,在執行個體中僅僅允許出現這個組中的一個子內容。對於圖中的例子而言,第一個子內容是一個內部group元素,引用以 shipAndBill命名的元素組,這個元素組由元素序列shipTo、billTo組成。第二個子內容為singleUSAddress。因此,在一 個執行個體文檔中,purchaseOrder元素必須,要麼包含一個billTo元素和一個shipTo元素,要麼包含一個singleUSAddress 元素。

choice組後面跟著的是comment和items元素宣告。元素和組的聲明都是sequence 組的子內容。這樣定義的效果是comment和items元素必須按順序跟在地址元素後面。

在內容模型中被命名或未被命名的元素組(分別由group、choice、sequence、all所表現)可以帶有minOccurs 和maxOccurs屬性



屬性群組

我們可以建立一個被命名的屬性群組來包含所有item元素所期望的屬性,並且在item元素宣告中通過名字來引用這個屬性群組ItemDeleivery

通過這種方法來使用屬性群組,可以提高模式文檔的可讀性,同時也便於更新模式文檔。這是因為一個屬性群組能夠在一個地方定義和編輯,同時能夠在多個定義和聲明中被引用。注意到一個屬性群組可以包含其他屬性群組,同時還要注意到屬性群組的聲明和引用必須在複合類型定義的最後。



空值(Nil)

XML Schema 空值機制包括一個空值訊號。換句話說,作為元素內容而言,並沒有沒有真正的空值,代之的是一個說明元素的內容是空值的屬性。為了顯示這點,我們修改shipDate元素的聲明,這樣空值就能夠被明確地告知使用者了。

<xsd:element name="shipDate" type="xsd:date" nillable="true"/>

為了在執行個體文檔中明確的表示shipDate有一個空值,我們可以設定nil屬性為真:

<shipDate xsi:nil="true"></shipDate>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.