黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

XML Schema

系統(tǒng) 2471 0
XML Schema如同DTD一樣是負(fù)責(zé)定義和描述XML文檔的結(jié)構(gòu)和內(nèi)容模式。它可以定義XML文檔中存在哪些元素和元素之間的關(guān)系,并且可以定義元素和屬性的數(shù)據(jù)類型。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

什么是XML Schema

XML Schema如同DTD一樣是負(fù)責(zé)定義和描述XML文檔的結(jié)構(gòu)和內(nèi)容模式。它可以定義XML文檔中存在哪些元素和元素之間的關(guān)系,并且可以定義元素和屬性的數(shù)據(jù)類型。

XML Schema本身是一個(gè)XML文檔,它符合XML語法結(jié)構(gòu)。可以用通用的XML解析器解析它。





回頁首


為什么要使用Schema

我們前面已經(jīng)使用DTD來定義一個(gè)XML的結(jié)構(gòu)和數(shù)據(jù)類型,那為什么還要Schema呢?

因DTD有著不少缺陷:

1) DTD是基于正則表達(dá)式的,描述能力有限;
2) DTD沒有數(shù)據(jù)類型的支持,在大多數(shù)應(yīng)用環(huán)境下能力不足;
3) DTD的約束定義能力不足,無法對XML實(shí)例文檔作出更細(xì)致的語義限制;
4) DTD的結(jié)構(gòu)不夠結(jié)構(gòu)化,重用的代價(jià)相對較高;
5) DTD并非使用XML作為描述手段,而DTD的構(gòu)建和訪問并沒有標(biāo)準(zhǔn)的編程接口,無法使用標(biāo)準(zhǔn)的編程方式進(jìn)行DTD維護(hù)。

而XML Schema正是針對這些DTD的缺點(diǎn)而設(shè)計(jì)的,XML Schema的優(yōu)點(diǎn):

1) XML Schema基于XML,沒有專門的語法
2) XML可以象其他XML文件一樣解析和處理
3) XML Schema支持一系列的數(shù)據(jù)類型(int、float、Boolean、date等)
4) XML Schema提供可擴(kuò)充的數(shù)據(jù)模型。
5) XML Schema支持綜合命名空間
6) XML Schema支持屬性組。





回頁首


一個(gè)簡單的XML Schema文檔



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

下面的XML片段是合法的:

            
              
<quantity>5</quantity>

            
          

下面的XML片段是非法的:

            
              
<quantity>-4</quantiy>

            
          





回頁首


Schema中的類型

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

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

a)類型定義部件: 簡單類型和復(fù)合類型
b)組部件
c)屬性組部件





回頁首


簡單類型



XML Schema中定義了一些內(nèi)建的數(shù)據(jù)類型,這些類型可以用來描述元素的內(nèi)容和屬性值。

一個(gè)元素中如果僅僅包含數(shù)字、字符串或其他數(shù)據(jù),但不包括子元素,這種被稱為簡單類型。

如同圖中元素quantity就是一個(gè)簡單類型。它的元素內(nèi)容必須是非負(fù)整數(shù),不包括任何屬性和子元素。

            
              <quantity>some</quantity>
            
          





回頁首


所有內(nèi)建的簡單類型

原始類型

            
              
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)

            
          





回頁首


創(chuàng)建簡單類型



圖中我們先創(chuàng)建了一個(gè)簡單類型:quantityType,它是從integer繼承過來的,minInclusive和maxInclusive定義了它的最小值2和最大值5。最后我們定義元素quantity的類型為quantityType。

            
              
正確:	<quantity>3</quantity>
錯(cuò)誤:	<quantity>10</quantity>
<qauntity>aaa</quantity>

            
          

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

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

            
          





回頁首


簡單類型的例子 1



這個(gè)SKU的類型的取值:3個(gè)數(shù)字后面根著一個(gè)連字號接著跟著兩個(gè)大寫的英文字母。

pattern后面跟的是正則表達(dá)式。有關(guān)正則表達(dá)式的語法請參閱其他書籍。

            
              
正確:	<ourSKU>123-AB</ourSKU>
錯(cuò)誤:	<ourSKU>abc-AB</ourSKU>
<ourSKU>123-ab</ourSKU>

            
          





回頁首


簡單類型的例子 2



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

<!-- and so on ...-> 這是一個(gè)注釋語句。

            
              
正確:	<statename>AK</statename>
錯(cuò)誤:	<statename>Alaska</statename>

            
          





回頁首


列表類型



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

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

            
          





回頁首


聯(lián)合類型



圖中用union來定義了一個(gè)聯(lián)合類型,里面的成員類型包括USState和listOfMyIntType,應(yīng)用了聯(lián)合類型的元素的值可以是這些原子類型或列表類型中的一個(gè)類型的實(shí)例,但是一個(gè)元素實(shí)例不能同時(shí)包含兩個(gè)類型。

            
              
正確:	<zips>CA</zips>
<zips>95630 95977 95945</zips>
<zips>AK</zips>
錯(cuò)誤:	<zips>CA 95630</zips>

            
          


匿名類型定義


前面我們在定義元素類型時(shí)總是先定義一個(gè)數(shù)據(jù)類型,然后再把元素的type設(shè)成新定義的數(shù)據(jù)類型。如果這個(gè)新的數(shù)據(jù)類型只會用一次,我們就可以直接設(shè)置在元素定義里面,而不用另外來設(shè)置。如圖中元素quantity的類型就是一個(gè)從1到99的整數(shù)。

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





回頁首


復(fù)合類型



前面我們所講到的都是屬于簡單類型,即元素里面只有內(nèi)容,不再包括屬性或者其它元素。接下來我們要讓元素里面包含屬性和其它元素,稱之為復(fù)合類型。

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

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

            
          





回頁首


混合內(nèi)容



同樣,我們采用了匿名類型方式來定義一個(gè)元素salutation。我們注意到在complexType后面多了一個(gè)mixed="true",這表明這是一個(gè)混合類型:里面既有元素本身的內(nèi)容,又有其它子元素。name元素就是salutation的子元素。

            
              
正確:	<salutation>Dear Mr.<name>Robert Smith</name>.</salutation>
錯(cuò)誤:	<salutation>Dear Mr.</salutation>

            
          

sequence表示子元素出現(xiàn)的順序要和schema里面的順序一樣。我們在后面還會講到和sequence對應(yīng)的choice和all兩種方式。





回頁首


空內(nèi)容



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

圖中complexConet表示只包含子元素,然后我們定義了兩個(gè)屬性currency和value,但是卻不定義任何子元素。

            
              
正確:
<internationalPrice currency="EUR" value="423.46"/>
錯(cuò)誤:
<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>

            
          

因?yàn)橐粋€(gè)不帶有simpleContent 或者complexContent的復(fù)合類型定義,會被解釋為帶有類型定義為anyType的complexContent,這是一個(gè)默認(rèn)的速記方法,所以這個(gè)簡潔的語法可以在模式處理器中工作。





回頁首


anyType



一個(gè)anyType類型不以任何形式約束其包含的內(nèi)容。我們可以象使用其他類型一樣使用anyType,如圖第一個(gè)語句,這個(gè)方式聲明的元素是不受約束的。所以元素的值可以為423.46,也可以為任何其他的字符序列,或者甚至是字符和元素的混合。實(shí)際上,anyType是默認(rèn)類型,所以上面的可以被重寫為第二個(gè)語句。

如果需要表示不受約束的元素內(nèi)容,舉例來說在元素包含散文,其中可能需要嵌入標(biāo)簽來支持國際化的表示,那么默認(rèn)的聲明(無約束)或者有些微約束的形式會很合適。





回頁首


注釋



為了方便其他讀者和應(yīng)用來理解模式文檔,XML Schema提供了三個(gè)元素用來注釋。

            
              
annotation
documentation
appinfo

            
          

圖中,我們在documentation元素中放置了一個(gè)基本的模式描述和版權(quán)信息,這是放置適合人閱讀的信息的推薦位置。我們推薦你在任何的documentation元素中使用xml:lang屬性來表示這些描述信息使用的語言。





回頁首


構(gòu)造內(nèi)容模型



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

對于choice組元素而言,在實(shí)例中僅僅允許出現(xiàn)這個(gè)組中的一個(gè)子內(nèi)容。對于圖中的例子而言,第一個(gè)子內(nèi)容是一個(gè)內(nèi)部group元素,引用以shipAndBill命名的元素組,這個(gè)元素組由元素序列shipTo、billTo組成。第二個(gè)子內(nèi)容為singleUSAddress。因此,在一個(gè)實(shí)例文檔中,purchaseOrder元素必須,要么包含一個(gè)billTo元素和一個(gè)shipTo元素,要么包含一個(gè)singleUSAddress元素。

choice組后面跟著的是comment和items元素聲明。元素和組的聲明都是sequence 組的子內(nèi)容。這樣定義的效果是comment和items元素必須按順序跟在地址元素后面。

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





回頁首


屬性組



我們可以建立一個(gè)被命名的屬性組來包含所有item元素所期望的屬性,并且在item元素聲明中通過名字來引用這個(gè)屬性組ItemDeleivery

通過這種方法來使用屬性組,可以提高模式文檔的可讀性,同時(shí)也便于更新模式文檔。這是因?yàn)橐粋€(gè)屬性組能夠在一個(gè)地方定義和編輯,同時(shí)能夠在多個(gè)定義和聲明中被引用。注意到一個(gè)屬性組可以包含其他屬性組,同時(shí)還要注意到屬性組的聲明和引用必須在復(fù)合類型定義的最后。





回頁首


空值(Nil)



XML Schema 空值機(jī)制包括一個(gè)空值信號。換句話說,作為元素內(nèi)容而言,并沒有沒有真正的空值,代之的是一個(gè)說明元素的內(nèi)容是空值的屬性。為了顯示這點(diǎn),我們修改shipDate元素的聲明,這樣空值就能夠被明確地告知用戶了。

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

            
          

為了在實(shí)例文檔中明確的表示shipDate有一個(gè)空值,我們可以設(shè)置nil屬性為真:

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

            
          





回頁首






回頁首


關(guān)于作者

IBM has authored this article

XML Schema


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論