日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Schema详解

發(fā)布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Schema详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

XML Schema 簡介

XSD 為何使用? ??XML Schema 是基于 XML 的 DTD 替代者。? ??XML Schema 可描述 XML 文檔的結(jié)構(gòu)。? ??XML Schema 語言也可作為 XSD(XML Schema Definition)來引用。
在繼續(xù)學(xué)習(xí)之前,您需要對下面的知識有基本的了解:? ??HTML / XHTML? ??XML 以及 XML 命名空間? ??對 DTD 的基本了解
XML Schema 的作用是定義 XML 文檔的合法構(gòu)建模塊,類似 DTD。XML Schema:? ? 定義可出現(xiàn)在文檔中的元素? ? 定義可出現(xiàn)在文檔中的屬性? ? 定義哪個元素是子元素? ? 定義子元素的次序? ? 定義子元素的數(shù)目? ? 定義元素是否為空,或者是否可包含文本? ? 定義元素和屬性的數(shù)據(jù)類型? ? 定義元素和屬性的默認(rèn)值以及固定值
XML Schema 是 DTD 的繼任者我們認(rèn)為 XML Schema 很快會在大部分網(wǎng)絡(luò)應(yīng)用程序中取代 DTD。理由如下:? ? XML Schema 可針對未來的需求進(jìn)行擴(kuò)展? ? XML Schema 更完善,功能更強(qiáng)大? ? XML Schema 基于 XML 編寫? ? XML Schema 支持?jǐn)?shù)據(jù)類型? ? XML Schema 支持命名空間

為什么要使用 XML Schema?

XML Schema 支持?jǐn)?shù)據(jù)類型XML Schema 最重要的能力之一就是對數(shù)據(jù)類型的支持。通過對數(shù)據(jù)類型的支持:? ? 可更容易地描述允許的文檔內(nèi)容? ? 可更容易地驗(yàn)證數(shù)據(jù)的正確性? ? 可更容易地與來自數(shù)據(jù)庫的數(shù)據(jù)一并工作? ? 可更容易地定義數(shù)據(jù)約束(data facets)? ? 可更容易地定義數(shù)據(jù)模型(或稱數(shù)據(jù)格式)? ? 可更容易地在不同的數(shù)據(jù)類型間轉(zhuǎn)換數(shù)據(jù)
注:數(shù)據(jù)約束,或稱 facets,是 XML Schema 原型中的一個術(shù)語,中文可譯為“面”,用來約束數(shù)據(jù)類型的容許值。
XML Schema 使用 XML 語法由 XML 編寫 XML Schema 有很多好處:? ? 不必學(xué)習(xí)新的語言? ? 可使用 XML 編輯器來編輯 Schema 文件? ? 可使用 XML 解析器來解析 Schema 文件? ? 可通過 XML DOM 來處理 Schema? ? 可通過 XSLT 來轉(zhuǎn)換 Schema
XML Schema 可保護(hù)數(shù)據(jù)通信當(dāng)數(shù)據(jù)從發(fā)送方被發(fā)送到接受方時,其要點(diǎn)是雙方應(yīng)有關(guān)于內(nèi)容的相同的“期望值”。通過 XML Schema,發(fā)送方可以用一種接受方能夠明白的方式來描述數(shù)據(jù)。一種數(shù)據(jù),比如 "03-11-2004",在某些國家被解釋為11月3日,而在另一些國家為當(dāng)作3月11日。但是一個帶有數(shù)據(jù)類型的 XML 元素,比如:<date type="date">2004-03-11</date>,可確保對內(nèi)容一致的理解,這是因?yàn)?XML 的數(shù)據(jù)類型 "date" 要求的格式是 "YYYY-MM-DD"。
XML Schema 可擴(kuò)展XML Schema 是可擴(kuò)展的,因?yàn)樗鼈冇?XML 編寫。通過可擴(kuò)展的 Schema 定義,您可以:? ? 在其他 Schema 中重復(fù)使用您的 Schema? ? 創(chuàng)建由標(biāo)準(zhǔn)類型衍生而來的您自己的數(shù)據(jù)類型? ? 在相同的文檔中引用多重的 Schema
形式良好是不夠的我們把符合 XML 語法的文檔稱為形式良好的 XML 文檔,比如:? ? 它必須以 XML 聲明開頭? ? 它必須擁有唯一的根元素? ? 開始標(biāo)簽必須與結(jié)束標(biāo)簽相匹配? ? 元素對大小寫敏感? ? 所有的元素都必須關(guān)閉? ? 所有的元素都必須正確地嵌套? ? 必須對特殊字符使用實(shí)體即使文檔的形式良好,仍然不能保證它們不會包含錯誤,并且這些錯誤可能會產(chǎn)生嚴(yán)重的后果。請考慮下面的情況:您訂購的了 5 打激光打印機(jī),而不是 5 臺。通過 XML Schema,大部分這樣的錯誤會被您的驗(yàn)證軟件捕獲到。

如何使用 XSD?

XML 文檔可對 DTD 或 XML Schema 進(jìn)行引用。一個簡單的 XML 文檔:請看這個名為 "note.xml" 的 XML 文檔:
  • <?xml version="1.0"?>
  • <note>
  • <to>George</to>
  • <from>John</from>
  • <heading>Reminder</heading>
  • <body>Don't forget the meeting!</body>
  • </note>
  • DTD 文件下面這個例子是名為 "note.dtd" 的 DTD 文件,它對上面那個 XML 文檔的元素進(jìn)行了定義:
  • <!ELEMENT note (to, from, heading, body)>
  • <!ELEMENT to (#PCDATA)>
  • <!ELEMENT from (#PCDATA)>
  • <!ELEMENT heading (#PCDATA)>
  • <!ELEMENT body (#PCDATA)>
  • 第 1 行定義 note 元素有四個子元素:"to, from, heading, body"。第 2-5 行定義了 to, from, heading, body 元素的類型是 "#PCDATA"。XML Schema下面這個例子是一個名為 "note.xsd" 的 XML Schema 文件,它定義了上面那個 XML 文檔的元素:
  • <?xml version="1.0"?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • targetNamespace="http://www.w3school.com.cn"
  • xmlns="http://www.w3school.com.cn"
  • elementFormDefault="qualified">
  • <xs:element name="note">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="to" type="xs:string"/>
  • <xs:element name="from" type="xs:string"/>
  • <xs:element name="heading" type="xs:string"/>
  • <xs:element name="body" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • </xs:schema>
  • note 元素是一個復(fù)合類型,因?yàn)樗渌淖釉亍F渌?(to, from, heading, body) 是簡易類型,因?yàn)樗鼈儧]有包含其他元素。對 DTD 的引用此文件包含對 DTD 的引用:
  • <?xml version="1.0"?>
  • <!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd">
  • <note>
  • <to>George</to>
  • <from>John</from>
  • <heading>Reminder</heading>
  • <body>Don't forget the meeting!</body>
  • </note>
  • 對 XML Schema 的引用此文件包含對 XML Schema 的引用:
  • <?xml version="1.0"?>
  • <note
  • xmlns="http://www.w3school.com.cn"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
  • <to>George</to>
  • <from>John</from>
  • <heading>Reminder</heading>
  • <body>Don't forget the meeting!</body>
  • </note>

  • XSD - <schema> 元素

    <schema> 元素是每一個 XML Schema 的根元素:
  • <?xml version="1.0"?>
  • <xs:schema>
  • ...
  • ...
  • </xs:schema>
  • <schema> 元素可包含屬性。一個 schema 聲明往往看上去類似這樣:
  • <?xml version="1.0"?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • targetNamespace="http://www.w3school.com.cn"
  • xmlns="http://www.w3school.com.cn"
  • elementFormDefault="qualified">
  • ...
  • ...
  • </xs:schema>
  • 代碼解釋:
  • xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • 顯示 schema 中用到的元素和數(shù)據(jù)類型來自命名空間 "http://www.w3.org/2001/XMLSchema"。同時它還規(guī)定了來自命名空間 "http://www.w3.org/2001/XMLSchema" 的元素和數(shù)據(jù)類型應(yīng)該使用前綴 xs:
  • targetNamespace="http://www.w3school.com.cn"
  • 聲明(只是聲明,并不能說明當(dāng)前schema默認(rèn)使用該命名空間)被此 schema 定義的元素 (note, to, from, heading, body) 屬于命名空間: "http://www.w3school.com.cn"。
  • xmlns="http://www.w3school.com.cn"
  • 指出默認(rèn)使用的命名空間。與targetNamespace相同,說明默認(rèn)使用當(dāng)前命名空間
  • elementFormDefault="qualified"
  • 指出任何 XML 實(shí)例文檔所使用的且在此 schema 中聲明過的元素必須被命名空間限定。
  • <?xml version="1.0" encoding="UTF-8"?>
  • <sp:note xmlns:sp="http://www.w3school.com.cn"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
  • <!--note.xsd使用elementFormDefault="unqualified"-->
  • <to>George</to>
  • <from>John</from>
  • <heading>Reminder</heading>
  • <body>Don't forget the meeting!</body>
  • </sp:note>
  • <?xml version="1.0" encoding="UTF-8"?>
  • <sp:note xmlns:sp="http://www.w3school.com.cn"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
  • <!--note.xsd使用elementFormDefault="qualified"-->
  • <sp:to>George</sp:to>
  • <sp:from>John</sp:from>
  • <sp:heading>Reminder</sp:heading>
  • <sp:body>Don't forget the meeting!</sp:body>
  • </sp:note>
  • 命名空間http://www.w3.org/2001/XMLSchema聲明的元素最終由http://www.w3.org/2001/XMLSchema.dtd校驗(yàn)
    ?此 XML 文檔含有對 XML Schema 的引用:
  • <?xml version="1.0"?>
  • <note xmlns="http://www.w3school.com.cn"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
  • <to>George</to>
  • <from>John</from>
  • <heading>Reminder</heading>
  • <body>Don't forget the meeting!</body>
  • </note>
  • xmlns="http://www.w3school.com.cn"?規(guī)定了默認(rèn)命名空間的聲明。此聲明會告知 schema 驗(yàn)證器,在此 XML 文檔中使用的所有元素都屬于 "http://www.w3school.com.cn" 這個命名空間。
    一旦您擁有了可用的 XML Schema 實(shí)例命名空間:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?您就可以使用 schemaLocation 屬性了。該屬性將具有目標(biāo)命名空間的 XSD文檔與實(shí)例文檔相關(guān)聯(lián)。?此屬性有兩個值:"http://www.w3school.com.cn note.xsd"第一個值是需要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置:xsi:schemaLocation="http://www.w3school.com.cn note.xsd"提供多個指定命名空間的XSD文檔的位置信息
  • xsi:schemaLocation=
  • "http://contoso.com/People
  • http://contoso.com/schemas/people.xsd
  • http://contoso.com/schemas/Vehicles
  • http://contoso.com/schemas/vehicles.xsd
  • http://contoso.com/schemas/People
  • http://contoso.com/schemas/people.xsd"

  • XSD 簡易元素

    XML Schema 可定義 XML 文件的元素。簡易元素指那些只包含文本的元素。它不會包含任何其他的元素或?qū)傩浴?/span>不過,“僅包含文本”這個限定卻很容易造成誤解。文本有很多類型。它可以是 XML Schema 定義中包括的類型中的一種(布爾、字符串、數(shù)據(jù)等等),或者它也可以是您自行定義的定制類型。您也可向數(shù)據(jù)類型添加限定(即 facets),以此來限制它的內(nèi)容,或者您可以要求數(shù)據(jù)匹配某種特定的模式。定義簡易元素<xs:element name="xxx" type="yyy"/>此處 xxx 指元素的名稱,yyy 指元素的數(shù)據(jù)類型。XML Schema 擁有很多內(nèi)建的數(shù)據(jù)類型。最常用的類型是:? ? xs:string?xs:decimal?xs:integer?xs:boolean?xs:date?xs:time例子:這是一些 XML 元素:
  • <lastname>Smith</lastname>
  • <age>28</age>
  • <dateborn>1980-03-27</dateborn>
  • 這是相應(yīng)的簡易元素定義:
  • <xs:element name="lastname" type="xs:string"/>
  • <xs:element name="age" type="xs:integer"/>
  • <xs:element name="dateborn" type="xs:date"/>
  • 簡易元素的默認(rèn)值和固定值簡易元素可擁有指定的默認(rèn)值或固定值。當(dāng)沒有其他的值被規(guī)定時,默認(rèn)值就會自動分配給元素。在下面的例子中,缺省值是 "red":<xs:element name="color" type="xs:string" default="red"/>固定值同樣會自動分配給元素,并且您無法規(guī)定另外一個值。在下面的例子中,固定值是 "red":<xs:element name="color" type="xs:string" fixed="red"/>

    XSD 屬性

    什么是屬性?簡易元素?zé)o法擁有屬性。假如某個元素?fù)碛袑傩?#xff0c;它就會被當(dāng)作某種復(fù)合類型。但是屬性本身總是作為簡易類型被聲明的。如何聲明屬性?定義屬性的語法是:<xs:attribute name="xxx" type="yyy"/>在此處,xxx 指屬性名稱,yyy 則規(guī)定屬性的數(shù)據(jù)類型。XML Schema 擁有很多內(nèi)建的數(shù)據(jù)類型。最常用的類型是:?xs:string?? xs:decimal ??xs:integer ??xs:boolean ??xs:date ??xs:time實(shí)例這是帶有屬性的 XML 元素:<lastname lang="EN">Smith</lastname>這是對應(yīng)的屬性定義:<xs:attribute name="lang" type="xs:string"/>
    屬性的默認(rèn)值和固定值屬性可擁有指定的默認(rèn)值或固定值。當(dāng)沒有其他的值被規(guī)定時,默認(rèn)值就會自動分配給元素。在下面的例子中,缺省值是 "EN":<xs:attribute name="lang" type="xs:string" default="EN"/>固定值同樣會自動分配給元素,并且您無法規(guī)定另外的值。在下面的例子中,固定值是 "EN":<xs:attribute name="lang" type="xs:string" fixed="EN"/>可選的和必需的屬性在缺省的情況下,屬性是可選的。如需規(guī)定屬性為必選,請使用 "use" 屬性:<xs:attribute name="lang" type="xs:string" use="required"/>對內(nèi)容的限定當(dāng) XML 元素或?qū)傩該碛斜欢x的數(shù)據(jù)類型時,就會向元素或?qū)傩缘膬?nèi)容添加限定。假如 XML 元素的類型是 "xs:date",而其包含的內(nèi)容是類似 "Hello World" 的字符串,元素將不會(通過)驗(yàn)證。
    通過 XML schema,您也可向您的 XML 元素及屬性添加自己的限定。這些限定被稱為 facet(可譯為限定面)。

    XSD 限定 / Facets

    限定(restriction)用于為 XML 元素或者屬性定義可接受的值。對 XML 元素的限定被稱為 facet。對值的限定下面的例子定義了帶有一個限定且名為 "age" 的元素。age 的值不能低于 0 或者高于 120:
  • <xs:element name="age">
  • <xs:simpleType>
  • <xs:restriction base="xs:integer">
  • <xs:minInclusive value="0"/>
  • <xs:maxInclusive value="120"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 對一組值的限定如需把 XML 元素的內(nèi)容限制為一組可接受的值,我們要使用枚舉約束(enumeration constraint)。下面的例子定義了帶有一個限定的名為 "car" 的元素。可接受的值只有:Audi, Golf, BMW:
  • <xs:element name="car">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:enumeration value="Audi"/>
  • <xs:enumeration value="Golf"/>
  • <xs:enumeration value="BMW"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 上面的例子也可以被寫為:
  • <xs:element name="car" type="carType"/>
  • <xs:simpleType name="carType">
  • <xs:restriction base="xs:string">
  • <xs:enumeration value="Audi"/>
  • <xs:enumeration value="Golf"/>
  • <xs:enumeration value="BMW"/>
  • </xs:restriction>
  • </xs:simpleType>
  • 注釋:在這種情況下,類型 "carType" 可被其他元素使用,因?yàn)樗皇?"car" 元素的組成部分。對一系列值的限定如需把 XML 元素的內(nèi)容限制定義為一系列可使用的數(shù)字或字母,我們要使用模式約束(pattern constraint)。下面的例子定義了帶有一個限定的名為 "letter" 的元素。可接受的值只有小寫字母 a - z 其中的一個:
  • <xs:element name="letter">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="[a-z]"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 下一個例子定義了帶有一個限定的名為 "initials" 的元素。可接受的值是大寫字母 A - Z 其中的三個:
  • <xs:element name="initials">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="[A-Z][A-Z][A-Z]"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 下一個例子也定義了帶有一個限定的名為 "initials" 的元素。可接受的值是大寫或小寫字母 a - z 其中的三個:
  • <xs:element name="initials">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 下一個例子定義了帶有一個限定的名為 "choice 的元素。可接受的值是字母 x, y 或 z 中的一個:
  • <xs:element name="choice">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="[xyz]"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 下一個例子定義了帶有一個限定的名為 "prodid" 的元素。可接受的值是五個阿拉伯?dāng)?shù)字的一個序列,且每個數(shù)字的范圍是 0-9:
  • <xs:element name="prodid">
  • <xs:simpleType>
  • <xs:restriction base="xs:integer">
  • <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 對一系列值的其他限定下面的例子定義了帶有一個限定的名為 "letter" 的元素。可接受的值是 a - z 中零個或多個字母:
  • <xs:element name="letter">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="([a-z])*"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 下面的例子定義了帶有一個限定的名為 "letter" 的元素。可接受的值是一對或多對字母,每對字母由一個小寫字母后跟一個大寫字母組成。舉個例子,"sToP"將會通過這種模式的驗(yàn)證,但是 "Stop"、"STOP" 或者 "stop" 無法通過驗(yàn)證:
  • <xs:element name="letter">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="([a-z][A-Z])+"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 下面的例子定義了帶有一個限定的名為 "gender" 的元素。可接受的值是 male 或者 female:
  • <xs:element name="gender">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="male|female"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 下面的例子定義了帶有一個限定的名為 "password" 的元素。可接受的值是由 8 個字符組成的一行字符,這些字符必須是大寫或小寫字母 a - z 亦或數(shù)字 0 - 9:
  • <xs:element name="password">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="[a-zA-Z0-9]{8}"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 對空白字符的限定如需規(guī)定對空白字符(whitespace characters)的處理方式,我們需要使用 whiteSpace 限定。下面的例子定義了帶有一個限定的名為 "address" 的元素。這個 whiteSpace 限定被設(shè)置為 "preserve",這意味著 XML 處理器不會移除任何空白字符:
  • <xs:element name="address">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:whiteSpace value="preserve"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 這個例子也定義了帶有一個限定的名為 "address" 的元素。這個 whiteSpace 限定被設(shè)置為 "replace",這意味著 XML 處理器將移除所有空白字符(換行、回車、空格以及制表符):
  • <xs:element name="address">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:whiteSpace value="replace"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 這個例子也定義了帶有一個限定的名為 "address" 的元素。這個 whiteSpace 限定被設(shè)置為 "collapse",這意味著 XML 處理器將移除所有空白字符(換行、回車、空格以及制表符會被替換為空格,開頭和結(jié)尾的空格會被移除,而多個連續(xù)的空格會被縮減為一個單一的空格):
  • <xs:element name="address">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:whiteSpace value="collapse"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 對長度的限定如需限制元素中值的長度,我們需要使用 length、maxLength 以及 minLength 限定。本例定義了帶有一個限定且名為 "password" 的元素。其值必須精確到 8 個字符:
  • <xs:element name="password">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:length value="8"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 這個例子也定義了帶有一個限定的名為 "password" 的元素。其值最小為 5 個字符,最大為 8 個字符:
  • <xs:element name="password">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:minLength value="5"/>
  • <xs:maxLength value="8"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:element>
  • 數(shù)據(jù)類型的限定限定描述
    enumeration定義可接受值的一個列表
    fractionDigits定義所允許的最大的小數(shù)位數(shù)。必須大于等于0。
    length定義所允許的字符或者列表項(xiàng)目的精確數(shù)目。必須大于或等于0。
    maxExclusive定義數(shù)值的上限。所允許的值必須小于此值。
    maxInclusive定義數(shù)值的上限。所允許的值必須小于或等于此值。
    maxLength定義所允許的字符或者列表項(xiàng)目的最大數(shù)目。必須大于或等于0。
    minExclusive定義數(shù)值的下限。所允許的值必需大于此值。
    minInclusive定義數(shù)值的下限。所允許的值必需大于或等于此值。
    minLength定義所允許的字符或者列表項(xiàng)目的最小數(shù)目。必須大于或等于0。
    pattern定義可接受的字符的精確序列。
    totalDigits定義所允許的阿拉伯?dāng)?shù)字的精確位數(shù)。必須大于0。
    whiteSpace定義空白字符(換行、回車、空格以及制表符)的處理方式。

    XSD 復(fù)合元素

    什么是復(fù)合元素?復(fù)合元素指包含其他元素及/或?qū)傩缘?XML 元素。有四種類型的復(fù)合元素:? ? 空元素? ? 包含其他元素的元素? ? 僅包含文本的元素? ? 包含元素和文本的元素注釋:上述元素均可包含屬性!
    復(fù)合元素的例子復(fù)合元素,"product",是空的:<product pid="1345"/>復(fù)合元素,"employee",僅包含其他元素:
  • <employee>
  • <firstname>John</firstname>
  • <lastname>Smith</lastname>
  • </employee>
  • 復(fù)合元素,"food",僅包含文本:<food type="dessert">Ice cream</food>復(fù)合元素,"description",包含元素和文本:
  • <description>
  • It happened on <date lang="norwegian">03.03.99</date> ....
  • </description>
  • 如何定義復(fù)合元素?請看這個復(fù)合 XML 元素,"employee",僅包含其他元素:
  • <employee>
  • <firstname>John</firstname>
  • <lastname>Smith</lastname>
  • </employee>
  • 在 XML Schema 中,我們有兩種方式來定義復(fù)合元素:1. 通過命名此元素,可直接對"employee"元素進(jìn)行聲明,就像這樣:
  • <xs:element name="employee">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 假如您使用上面所描述的方法,那么僅有 "employee" 可使用所規(guī)定的復(fù)合類型。請注意其子元素,"firstname" 以及 "lastname",被包圍在指示器 <sequence>中。這意味著子元素必須以它們被聲明的次序出現(xiàn)。2. "employee" 元素可以使用 type 屬性,這個屬性的作用是引用要使用的復(fù)合類型的名稱
  • <xs:element name="employee" type="personinfo"/>
  • <xs:complexType name="personinfo">
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • 如果您使用了上面所描述的方法,那么若干元素均可以使用相同的復(fù)合類型,比如這樣:
  • <xs:element name="employee" type="personinfo"/>
  • <xs:element name="student" type="personinfo"/>
  • <xs:element name="member" type="personinfo"/>
  • <xs:complexType name="personinfo">
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • 您也可以在已有的復(fù)合元素之上以某個復(fù)合元素為基礎(chǔ),然后添加一些元素,就像這樣:
  • <xs:element name="employee" type="fullpersoninfo"/>
  • <xs:complexType name="personinfo">
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • <xs:complexType name="fullpersoninfo">
  • <xs:complexContent>
  • <xs:extension base="personinfo">
  • <xs:sequence>
  • <xs:element name="address" type="xs:string"/>
  • <xs:element name="city" type="xs:string"/>
  • <xs:element name="country" type="xs:string"/>
  • </xs:sequence>
  • </xs:extension>
  • </xs:complexContent>
  • </xs:complexType>

  • XSD 復(fù)合空元素

    空的復(fù)合元素不能包含內(nèi)容,只能含有屬性。復(fù)合空元素:一個空的 XML 元素:<product prodid="1345" />上面的 "product" 元素根本沒有內(nèi)容。為了定義無內(nèi)容的類型,我們就必須聲明一個在其內(nèi)容中只能包含元素的類型,但是實(shí)際上我們并不會聲明任何元素,比如這樣:
  • <xs:element name="product">
  • <xs:complexType>
  • <xs:complexContent>
  • <xs:restriction base="xs:integer">
  • <xs:attribute name="prodid" type="xs:positiveInteger"/>
  • </xs:restriction>
  • </xs:complexContent>
  • </xs:complexType>
  • </xs:element>
  • 在上面的例子中,我們定義了一個帶有復(fù)合內(nèi)容的復(fù)合類型。complexContent 元素給出的信號是,我們打算限定或者拓展某個復(fù)合類型的內(nèi)容模型,而 integer 限定則聲明了一個屬性但不會引入任何的元素內(nèi)容。
    不過,也可以更加緊湊地聲明此 "product" 元素:
  • <xs:element name="product">
  • <xs:complexType>
  • <xs:attribute name="prodid" type="xs:positiveInteger"/>
  • </xs:complexType>
  • </xs:element>
  • 或者您可以為一個 complexType 元素起一個名字,然后為 "product" 元素設(shè)置一個 type 屬性并引用這個 complexType 名稱(通過使用此方法,若干個元素均可引用相同的復(fù)合類型):
  • <xs:element name="product" type="prodtype"/>
  • <xs:complexType name="prodtype">
  • <xs:attribute name="prodid" type="xs:positiveInteger"/>
  • </xs:complexType>

  • XSD 復(fù)合類型 - 僅含元素

    “僅含元素”的復(fù)合類型元素是只能包含其他元素的元素復(fù)合類型僅包含元素XML 元素,"person",僅包含其他的元素:
  • <person>
  • <firstname>John</firstname>
  • <lastname>Smith</lastname>
  • </person>
  • 您可在 schema 中這樣定義 "person" 元素:
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 請留意這個 <xs:sequence>。它意味著被定義的元素必須按上面的次序出現(xiàn)在 "person" 元素中。或者您可以為 complexType 元素設(shè)定一個名稱,并讓 "person" 元素的 type 屬性來引用此名稱(如使用此方法,若干元素均可引用相同的復(fù)合類型):
  • <xs:element name="person" type="persontype"/>
  • <xs:complexType name="persontype">
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>

  • XSD 僅含文本復(fù)合元素

    此類型僅包含簡易的內(nèi)容(文本和屬性),因此我們要向此內(nèi)容添加 simpleContent 元素。當(dāng)使用簡易內(nèi)容時,我們就必須在 simpleContent 元素內(nèi)定義擴(kuò)展或限定,就像這樣:
  • <xs:element name="某個名稱">
  • <xs:complexType>
  • <xs:simpleContent>
  • <xs:extension base="basetype">
  • ....
  • ....
  • </xs:extension>
  • </xs:simpleContent>
  • </xs:complexType>
  • </xs:element>
  • 或者:
  • <xs:element name="某個名稱">
  • <xs:complexType>
  • <xs:simpleContent>
  • <xs:restriction base="basetype">
  • ....
  • ....
  • </xs:restriction>
  • </xs:simpleContent>
  • </xs:complexType>
  • </xs:element>
  • 提示:請使用 extension 或 restriction 元素來擴(kuò)展或限制元素的基本簡易類型。這里有一個 XML 元素的例子,"shoesize",其中僅包含文本:<shoesize country="france">35</shoesize>下面這個例子聲明了一個復(fù)合類型,其內(nèi)容被定義為整數(shù)值,并且 "shoesize" 元素含有名為 "country" 的屬性:
  • <xs:element name="shoesize">
  • <xs:complexType>
  • <xs:simpleContent>
  • <xs:extension base="xs:integer">
  • <xs:attribute name="country" type="xs:string" />
  • </xs:extension>
  • </xs:simpleContent>
  • </xs:complexType>
  • </xs:element>
  • 我們也可為 complexType 元素設(shè)定一個名稱,并讓 "shoesize" 元素的 type 屬性來引用此名稱(通過使用此方法,若干元素均可引用相同的復(fù)合類型):
  • <xs:element name="shoesize" type="shoetype"/>
  • <xs:complexType name="shoetype">
  • <xs:simpleContent>
  • <xs:extension base="xs:integer">
  • <xs:attribute name="country" type="xs:string" />
  • </xs:extension>
  • </xs:simpleContent>
  • </xs:complexType>

  • XSD 帶有混合內(nèi)容的復(fù)合類型

    混合的復(fù)合類型可包含屬性、元素以及文本。帶有混合內(nèi)容的復(fù)合類型XML 元素,"letter",含有文本以及其他元素:
  • <letter>
  • Dear Mr.<name>John Smith</name>.
  • Your order <orderid>1032</orderid>
  • will be shipped on <shipdate>2001-07-13</shipdate>.
  • </letter>
  • 下面這個 schema 聲明了這個 "letter" 元素:
  • <xs:element name="letter">
  • <xs:complexType mixed="true">
  • <xs:sequence>
  • <xs:element name="name" type="xs:string"/>
  • <xs:element name="orderid" type="xs:positiveInteger"/>
  • <xs:element name="shipdate" type="xs:date"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 注釋:為了使字符數(shù)據(jù)可以出現(xiàn)在 "letter" 的子元素之間,mixed 屬性必須被設(shè)置為 "true"。<xs:sequence> 標(biāo)簽 (name、orderid 以及 shipdate ) 意味著被定義的元素必須依次出現(xiàn)在 "letter" 元素內(nèi)部。我們也可以為 complexType 元素起一個名字,并讓 "letter" 元素的 type 屬性引用 complexType 的這個名稱(通過這個方法,若干元素均可引用同一個復(fù)合類型):
  • <xs:element name="letter" type="lettertype"/>
  • <xs:complexType name="lettertype" mixed="true">
  • <xs:sequence>
  • <xs:element name="name" type="xs:string"/>
  • <xs:element name="orderid" type="xs:positiveInteger"/>
  • <xs:element name="shipdate" type="xs:date"/>
  • </xs:sequence>
  • </xs:complexType>

  • XSD 復(fù)合類型指示器

    通過指示器,我們可以控制在文檔中使用元素的方式。有七種指示器:Order 指示器:? ? All? ? Choice? ? SequenceOccurrence 指示器:? ? maxOccurs? ? minOccursGroup 指示器:? ? Group name? ? attributeGroup nameOrder 指示器? ??Order 指示器用于定義元素的順序。All 指示器? ??<all> 指示器規(guī)定子元素可以按照任意順序出現(xiàn),且每個子元素必須只出現(xiàn)一次:
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:all>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:all>
  • </xs:complexType>
  • </xs:element>
  • 注釋:當(dāng)使用 <all> 指示器時,你可以把 <minOccurs> 設(shè)置為 0 或者 1,而只能把 <maxOccurs> 指示器設(shè)置為 1(稍后將講解 <minOccurs> 以及 <maxOccurs>)。Choice 指示器<choice> 指示器規(guī)定可出現(xiàn)某個子元素或者可出現(xiàn)另外一個子元素(非此即彼):
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:choice>
  • <xs:element name="employee" type="employee"/>
  • <xs:element name="member" type="member"/>
  • </xs:choice>
  • </xs:complexType>
  • </xs:element>
  • 提示:如需設(shè)置子元素出現(xiàn)任意次數(shù),可將 <maxOccurs> (稍后會講解)設(shè)置為 unbounded(無限次)。Sequence 指示器<sequence> 規(guī)定子元素必須按照特定的順序出現(xiàn):
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • Occurrence 指示器Occurrence 指示器用于定義某個元素出現(xiàn)的頻率。注釋:對于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默認(rèn)值均為 1。maxOccurs 指示器<maxOccurs> 指示器可規(guī)定某個元素可出現(xiàn)的最大次數(shù):
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="full_name" type="xs:string"/>
  • <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 上面的例子表明,子元素 "child_name" 可在 "person" 元素中最少出現(xiàn)一次(其中 minOccurs 的默認(rèn)值是 1),最多出現(xiàn) 10 次。minOccurs 指示器<minOccurs> 指示器可規(guī)定某個元素能夠出現(xiàn)的最小次數(shù):
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="full_name" type="xs:string"/>
  • <xs:element name="child_name" type="xs:string"
  • maxOccurs="10" minOccurs="0"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 上面的例子表明,子元素 "child_name" 可在 "person" 元素中出現(xiàn)最少 0 次,最多出現(xiàn) 10 次。提示:如需使某個元素的出現(xiàn)次數(shù)不受限制,請使用 maxOccurs="unbounded" 這個聲明:一個實(shí)際的例子:名為 "Myfamily.xml" 的 XML 文件:
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:noNamespaceSchemaLocation="family.xsd">
  • <person>
  • <full_name>Tony Smith</full_name>
  • <child_name>Cecilie</child_name>
  • </person>
  • <person>
  • <full_name>David Smith</full_name>
  • <child_name>Jogn</child_name>
  • <child_name>mike</child_name>
  • <child_name>kyle</child_name>
  • <child_name>mary</child_name>
  • </person>
  • <person>
  • <full_name>Michael Smith</full_name>
  • </person>
  • </persons>
  • 上面這個 XML 文件含有一個名為 "persons" 的根元素。在這個根元素內(nèi)部,我們定義了三個 "person" 元素。每個 "person" 元素必須含有一個 "full_name" 元素,同時它可以包含多至 5 個 "child_name" 元素。這是schema文件"family.xsd":
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • elementFormDefault="qualified">
  • <xs:element name="persons">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="person" maxOccurs="unbounded">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="full_name" type="xs:string"/>
  • <xs:element name="child_name" type="xs:string"
  • minOccurs="0" maxOccurs="5"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • </xs:schema>
  • Group 指示器Group 指示器用于定義相關(guān)的數(shù)批元素。元素組元素組通過 group 聲明進(jìn)行定義:
  • <xs:group name="組名稱">
  • ...
  • </xs:group>
  • 您必須在 group 聲明內(nèi)部定義一個 all、choice 或者 sequence 元素。下面這個例子定義了名為 "persongroup" 的 group,它定義了必須按照精確的順序出現(xiàn)的一組元素:
  • <xs:group name="persongroup">
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • <xs:element name="birthday" type="xs:date"/>
  • </xs:sequence>
  • </xs:group>
  • 在您把 group 定義完畢以后,就可以在另一個定義中引用它了:
  • <xs:group name="persongroup">
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • <xs:element name="birthday" type="xs:date"/>
  • </xs:sequence>
  • </xs:group>

  • <xs:element name="person" type="personinfo"/>
  • <xs:complexType name="personinfo">
  • <xs:sequence>
  • <xs:group ref="persongroup"/>
  • <xs:element name="country" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • 屬性組屬性組通過 attributeGroup 聲明來進(jìn)行定義:
  • <xs:attributeGroup name="組名稱">
  • ...
  • </xs:attributeGroup>
  • 下面這個例子定義了名為 "personattrgroup" 的一個屬性組:
  • <xs:attributeGroup name="personattrgroup">
  • <xs:attribute name="firstname" type="xs:string"/>
  • <xs:attribute name="lastname" type="xs:string"/>
  • <xs:attribute name="birthday" type="xs:date"/>
  • </xs:attributeGroup>
  • 在您已定義完畢屬性組之后,就可以在另一個定義中引用它了,就像這樣:
  • <xs:attributeGroup name="personattrgroup">
  • <xs:attribute name="firstname" type="xs:string"/>
  • <xs:attribute name="lastname" type="xs:string"/>
  • <xs:attribute name="birthday" type="xs:date"/>
  • </xs:attributeGroup>
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:attributeGroup ref="personattrgroup"/>
  • </xs:complexType>
  • </xs:element>

  • XSD <any> 元素

    <any> 元素使我們有能力通過未被 schema 規(guī)定的元素來拓展 XML 文檔!下面這個例子是從名為 "family.xsd" 的 XML schema 中引用的片段。它展示了一個針對 "person" 元素的聲明。通過使用 <any> 元素,我們可以通過任何元素(在 <lastname> 之后)擴(kuò)展 "person" 的內(nèi)容:
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • <xs:any minOccurs="0"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 現(xiàn)在,我們希望使用 "children" 元素來擴(kuò)展 "person" 元素。這此種情況下我們就可以這么做,即使以上這個 schema 的沒有聲明任何 "children" 元素。請看這個 schema 文件,名為 "children.xsd":
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • targetNamespace="http://www.w3school.com.cn"
  • xmlns="http://www.w3school.com.cn"
  • elementFormDefault="qualified">
  • <xs:element name="children">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="childname" type="xs:string"
  • maxOccurs="unbounded"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • </xs:schema>
  • 下面這個 XML 文件(名為 "Myfamily.xml"),使用了來自兩個不同的 schema 中的成分,"family.xsd" 和 "children.xsd":
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <persons xmlns="http://www.microsoft.com"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:SchemaLocation="http://www.microsoft.com family.xsd
  • http://www.w3school.com.cn children.xsd">
  • <person>
  • <firstname>David</firstname>
  • <lastname>Smith</lastname>
  • <children>
  • <childname>mike</childname>
  • </children>
  • </person>
  • <person>
  • <firstname>Tony</firstname>
  • <lastname>Smith</lastname>
  • </person>
  • </persons>
  • 上面這個 XML 文件是有效的,這是由于 schema "family.xsd" 允許我們通過在 "lastname" 元素后的可選元素來擴(kuò)展 "person" 元素。<any> 和 <anyAttribute> 均可用于制作可擴(kuò)展的文檔!它們使文檔有能力包含未在主 XML schema 中聲明過的附加元素。

    XSD <anyAttribute> 元素

    <anyAttribute> 元素使我們有能力通過未被 schema 規(guī)定的屬性來擴(kuò)展 XML 文檔!下面的例子是來自名為 "family.xsd" 的 XML schema 的一個片段。它為我們展示了針對 "person" 元素的一個聲明。通過使用 <anyAttribute> 元素,我們就可以向 "person" 元素添加任意數(shù)量的屬性:
  • <xs:element name="person">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="firstname" type="xs:string"/>
  • <xs:element name="lastname" type="xs:string"/>
  • </xs:sequence>
  • <xs:anyAttribute/>
  • </xs:complexType>
  • </xs:element>
  • 現(xiàn)在,我們希望通過 "gender" 屬性來擴(kuò)展 "person" 元素。在這種情況下我們就可以這樣做,即使這個 schema 的作者從未聲明過任何 "gender" 屬性。請看這個 schema 文件,名為 "attribute.xsd":
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • targetNamespace="http://www.w3school.com.cn"
  • xmlns="http://www.w3school.com.cn"
  • elementFormDefault="qualified">
  • <xs:attribute name="gender">
  • <xs:simpleType>
  • <xs:restriction base="xs:string">
  • <xs:pattern value="male|female"/>
  • </xs:restriction>
  • </xs:simpleType>
  • </xs:attribute>
  • </xs:schema>
  • 下面這個 XML(名為 "Myfamily.xml"),使用了來自不同 schema 的成分,"family.xsd" 和 "attribute.xsd":
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <persons xmlns="http://www.microsoft.com"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:SchemaLocation="http://www.microsoft.com family.xsd
  • http://www.w3school.com.cn attribute.xsd">
  • <person gender="female">
  • <firstname>Jane</firstname>
  • <lastname>Smith</lastname>
  • </person>
  • <person gender="male">
  • <firstname>David</firstname>
  • <lastname>Smith</lastname>
  • </person>
  • </persons>
  • 上面這個 XML 文件是有效的,這是因?yàn)?schema "family.xsd" 允許我們向 "person" 元素添加屬性。<any> 和 <anyAttribute> 均可用于制作可擴(kuò)展的文檔!它們使文檔有能力包含未在主 XML schema 中聲明過的附加元素。

    XSD 元素替換(Element Substitution)

    通過 XML Schema,一個元素可對另一個元素進(jìn)行替換。元素替換讓我們舉例說明:我們的用戶來自英國和挪威。我們希望有能力讓用戶選擇在 XML 文檔中使用挪威語的元素名稱還是英語的元素名稱。為了解決這個問題,我們可以在 XML schema 中定義一個 substitutionGroup。首先,我們聲明主元素,然后我們會聲明次元素,這些次元素可聲明它們能夠替換主元素。
  • <xs:element name="name" type="xs:string"/>
  • <xs:element name="navn" substitutionGroup="name"/>
  • 在上面的例子中,"name" 元素是主元素,而 "navn" 元素可替代 "name" 元素。請看一個 XML schema 的片段:
  • <xs:element name="name" type="xs:string"/>
  • <xs:element name="navn" substitutionGroup="name"/>
  • <xs:complexType name="custinfo">
  • <xs:sequence>
  • <xs:element ref="name"/>
  • </xs:sequence>
  • </xs:complexType>
  • <xs:element name="customer" type="custinfo"/>
  • <xs:element name="kunde" substitutionGroup="customer"/>
  • 有效的 XML 文檔類似這樣(根據(jù)上面的 schema):
  • <customer>
  • <name>John Smith</name>
  • </customer>
  • 或類似這樣:
  • <kunde>
  • <navn>John Smith</navn>
  • </kunde>
  • 阻止元素替換為防止其他的元素替換某個指定的元素,請使用 block 屬性:<xs:element name="name" type="xs:string" block="substitution"/>請看某個 XML schema 的片段:
  • <xs:element name="name" type="xs:string" block="substitution"/>
  • <xs:element name="navn" substitutionGroup="name"/>
  • <xs:complexType name="custinfo">
  • <xs:sequence>
  • <xs:element ref="name"/>
  • </xs:sequence>
  • </xs:complexType>
  • <xs:element name="customer" type="custinfo" block="substitution"/>
  • <xs:element name="kunde" substitutionGroup="customer"/>
  • 合法的 XML 文檔應(yīng)該類似這樣(根據(jù)上面的 schema):
  • <customer>
  • <name>John Smith</name>
  • </customer>
  • 但是下面的文檔不再合法:
  • <kunde>
  • <navn>John Smith</navn>
  • </kunde>
  • 使用 substitutionGroup可替換元素的類型必須和主元素相同,或者從主元素衍生而來。假如可替換元素的類型與主元素的類型相同,那么您就不必規(guī)定可替換元素的類型了。請注意,substitutionGroup 中的所有元素(主元素和可替換元素)必須被聲明為全局元素,否則就無法工作!什么是全局元素(Global Elements)?全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。

    一個 XSD 實(shí)例

    本節(jié)會為您演示如何編寫一個 XML Schema。您還將學(xué)習(xí)到編寫 schema 的不同方法。XML 文檔讓我們看看這個名為 "shiporder.xml" 的 XML 文檔:
  • <?xml version="1.0" encoding="ISO-8859-1"?>
  • <shiporder orderid="889923"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:noNamespaceSchemaLocation="shiporder.xsd">
  • <orderperson>George Bush</orderperson>
  • <shipto>
  • <name>John Adams</name>
  • <address>Oxford Street</address>
  • <city>London</city>
  • <country>UK</country>
  • </shipto>
  • <item>
  • <title>Empire Burlesque</title>
  • <note>Special Edition</note>
  • <quantity>1</quantity>
  • <price>10.90</price>
  • </item>
  • <item>
  • <title>Hide your heart</title>
  • <quantity>1</quantity>
  • <price>9.90</price>
  • </item>
  • </shiporder>
  • 上面的XML文檔包括根元素 "shiporder",其中包含必須名為 "orderid" 的屬性。"shiporder" 元素包含三個不同的子元素:"orderperson"、"shipto" 以及 "item"。"item" 元素出現(xiàn)了兩次,它含有一個 "title"、一個可選 "note" 元素、一個 "quantity" 以及一個 "price" 元素。上面這一行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",告知XML解析器根據(jù)某個 schema 來驗(yàn)證此文檔。這一行:xsi:noNamespaceSchemaLocation="shiporder.xsd" 規(guī)定了 schema 的位置(在這里,它與 "shiporder.xml" 處于相同的文件夾)。創(chuàng)建一個 XML Schema現(xiàn)在,我們需要為上面這個 XML 文檔創(chuàng)建一個 schema。我們可以通過打開一個新的文件來開始,并把這個文件命名為 "shiporder.xsd"。要創(chuàng)建schema,我們僅僅需要簡單地遵循 XML 文檔中的結(jié)構(gòu),定義我們所發(fā)現(xiàn)的每個元素。首先我們開始定義一個標(biāo)準(zhǔn)的 XML 聲明:
  • <?xml version="1.0" encoding="ISO-8859-1" ?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  • ...
  • ...
  • </xs:schema>
  • 在上面的 schema 中,我們使用了標(biāo)準(zhǔn)的命名空間 (xs),與此命名空間相關(guān)聯(lián)的 URI 是 Schema 的語言定義(Schema language definition),其標(biāo)準(zhǔn)值是 http://www.w3.org/2001/XMLSchema。接下來,我們需要定義 "shiporder" 元素。此元素?fù)碛幸粋€屬性,其中包含其他的元素,因此我們將它認(rèn)定為復(fù)合類型。"shiporder" 元素的子元素被 xs:sequence 元素包圍,定義了子元素的次序:
  • <xs:element name="shiporder">
  • <xs:complexType>
  • <xs:sequence>
  • ...
  • ...
  • </xs:sequence>
  • ...
  • </xs:complexType>
  • </xs:element>
  • 然后我們需要把 "orderperson" 元素定義為簡易類型(這是因?yàn)樗话魏螌傩曰蛘咂渌脑?#xff09;。類型 (xs:string) 的前綴是由命名空間的前綴規(guī)定的,此命名空間與指示預(yù)定義的 schema 數(shù)據(jù)類型的 XML schema 相關(guān)聯(lián):<xs:element name="orderperson" type="xs:string"/>接下來,我需要把兩個元素定義為復(fù)合類型:"shipto" 和 "item"。我們從定義 "shipto" 元素開始:
  • <xs:element name="shipto">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="name" type="xs:string"/>
  • <xs:element name="address" type="xs:string"/>
  • <xs:element name="city" type="xs:string"/>
  • <xs:element name="country" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 通過 schema,我們可使用 maxOccurs 和 minOccurs 屬性來定義某個元素可能出現(xiàn)的次數(shù)。maxOccurs 定義某元素出現(xiàn)次數(shù)的最大值,而 minOccurs 則定義某元素出現(xiàn)次數(shù)的最小值。maxOccurs 和 minOccurs 的默認(rèn)值都是 1!現(xiàn)在,我們可以定義 "item" 元素了。這個元素可在 "shiporder" 元素內(nèi)部出現(xiàn)多次。這是通過把 "item" 元素的 maxOccurs 屬性的值設(shè)定為 "unbounded" 來實(shí)現(xiàn)的,這樣 "item" 元素就可出現(xiàn)創(chuàng)作者所希望的任意多次。請注意,"note" 元素是可選元素。我們已經(jīng)把此元素的 minOccurs 屬性設(shè)定為 0 了:
  • <xs:element name="item" maxOccurs="unbounded">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="title" type="xs:string"/>
  • <xs:element name="note" type="xs:string" minOccurs="0"/>
  • <xs:element name="quantity" type="xs:positiveInteger"/>
  • <xs:element name="price" type="xs:decimal"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • 現(xiàn)在,我們可以聲明 "shiporder" 元素的屬性了。由于這是一個必選屬性,我們規(guī)定 use="required"。注釋:此屬性的聲明必須被置于最后<xs:attribute name="orderid" type="xs:string" use="required"/>這是這個名為 "shiporder.xsd" 的 schema 文件的文檔清單:
  • <?xml version="1.0" encoding="ISO-8859-1" ?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  • <xs:element name="shiporder">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="orderperson" type="xs:string"/>
  • <xs:element name="shipto">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="name" type="xs:string"/>
  • <xs:element name="address" type="xs:string"/>
  • <xs:element name="city" type="xs:string"/>
  • <xs:element name="country" type="xs:string"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • <xs:element name="item" maxOccurs="unbounded">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="title" type="xs:string"/>
  • <xs:element name="note" type="xs:string" minOccurs="0"/>
  • <xs:element name="quantity" type="xs:positiveInteger"/>
  • <xs:element name="price" type="xs:decimal"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • </xs:sequence>
  • <xs:attribute name="orderid" type="xs:string" use="required"/>
  • </xs:complexType>
  • </xs:element>
  • </xs:schema>
  • 分割 Schema前面的設(shè)計(jì)方法非常容易,但當(dāng)文檔很復(fù)雜時卻難以閱讀和維護(hù)。接下來介紹的設(shè)計(jì)方法基于首先對所有元素和屬性的定義,然后再使用 ref 屬性來引用它們。這是用新方法設(shè)計(jì)的 schema 文件:
  • <?xml version="1.0" encoding="ISO-8859-1" ?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  • <!-- 簡易元素的定義 -->
  • <xs:element name="orderperson" type="xs:string"/>
  • <xs:element name="name" type="xs:string"/>
  • <xs:element name="address" type="xs:string"/>
  • <xs:element name="city" type="xs:string"/>
  • <xs:element name="country" type="xs:string"/>
  • <xs:element name="title" type="xs:string"/>
  • <xs:element name="note" type="xs:string"/>
  • <xs:element name="quantity" type="xs:positiveInteger"/>
  • <xs:element name="price" type="xs:decimal"/>
  • <!-- 屬性的定義 -->
  • <xs:attribute name="orderid" type="xs:string"/>
  • <!-- 復(fù)合元素的定義 -->
  • <xs:element name="shipto">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element ref="name"/>
  • <xs:element ref="address"/>
  • <xs:element ref="city"/>
  • <xs:element ref="country"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • <xs:element name="item">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element ref="title"/>
  • <xs:element ref="note" minOccurs="0"/>
  • <xs:element ref="quantity"/>
  • <xs:element ref="price"/>
  • </xs:sequence>
  • </xs:complexType>
  • </xs:element>
  • <xs:element name="shiporder">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element ref="orderperson"/>
  • <xs:element ref="shipto"/>
  • <xs:element ref="item" maxOccurs="unbounded"/>
  • </xs:sequence>
  • <xs:attribute ref="orderid" use="required"/>
  • </xs:complexType>
  • </xs:element>
  • </xs:schema>
  • 使用指定的類型(Named Types)第三種設(shè)計(jì)方法定義了類或者類型,這樣使我們有能力重復(fù)使用元素的定義。具體的方式是:首先對簡易元素和復(fù)合元素進(jìn)行命名,然后通過元素的 type 屬性來指向它們。這是利用第三種方法設(shè)計(jì)的 schema 文件 ("shiporder.xsd"):
  • <?xml version="1.0" encoding="ISO-8859-1" ?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  • <xs:simpleType name="stringtype">
  • <xs:restriction base="xs:string"/>
  • </xs:simpleType>
  • <xs:simpleType name="inttype">
  • <xs:restriction base="xs:positiveInteger"/>
  • </xs:simpleType>
  • <xs:simpleType name="dectype">
  • <xs:restriction base="xs:decimal"/>
  • </xs:simpleType>
  • <xs:simpleType name="orderidtype">
  • <xs:restriction base="xs:string">
  • <xs:pattern value="[0-9]{6}"/>
  • </xs:restriction>
  • </xs:simpleType>
  • <xs:complexType name="shiptotype">
  • <xs:sequence>
  • <xs:element name="name" type="stringtype"/>
  • <xs:element name="address" type="stringtype"/>
  • <xs:element name="city" type="stringtype"/>
  • <xs:element name="country" type="stringtype"/>
  • </xs:sequence>
  • </xs:complexType>
  • <xs:complexType name="itemtype">
  • <xs:sequence>
  • <xs:element name="title" type="stringtype"/>
  • <xs:element name="note" type="stringtype" minOccurs="0"/>
  • <xs:element name="quantity" type="inttype"/>
  • <xs:element name="price" type="dectype"/>
  • </xs:sequence>
  • </xs:complexType>
  • <xs:complexType name="shipordertype">
  • <xs:sequence>
  • <xs:element name="orderperson" type="stringtype"/>
  • <xs:element name="shipto" type="shiptotype"/>
  • <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  • </xs:sequence>
  • <xs:attribute name="orderid" type="orderidtype" use="required"/>
  • </xs:complexType>
  • <xs:element name="shiporder" type="shipordertype"/>
  • </xs:schema>
  • restriction 元素顯示出數(shù)據(jù)類型源自于 W3C XML Schema 命名空間的數(shù)據(jù)類型。因此,下面的片段也就意味著元素或?qū)傩缘闹当仨毷亲址愋偷闹?#xff1a;<xs:restriction base="xs:string">restriction 元素常被用于向元素施加限制。請看下面這些來自以上 schema 的片段:
  • <xs:simpleType name="orderidtype">
  • <xs:restriction base="xs:string">
  • <xs:pattern value="[0-9]{6}"/>
  • </xs:restriction>
  • </xs:simpleType>
  • 這段代碼指示出,元素或?qū)傩缘闹当仨殲樽址?#xff0c;并且必須是連續(xù)的六個字符,同時這些字符必須是 0-9 的數(shù)字。

    XSD 字符串?dāng)?shù)據(jù)類型

    字符串?dāng)?shù)據(jù)類型用于可包含字符串的值。字符串?dāng)?shù)據(jù)類型(String Data Type)字符串?dāng)?shù)據(jù)類型可包含字符、換行、回車以及制表符。下面是一個關(guān)于某個 scheme 中字符串聲明的例子:? ??<xs:element name="customer" type="xs:string"/>文檔中的元素看上去應(yīng)該類似這樣:? ??<customer>John Smith</customer>或者類似這樣:<customer> John Smith </customer>注釋:如果您使用字符串?dāng)?shù)據(jù)類型,XML 處理器就不會更改其中的值。規(guī)格化字符串?dāng)?shù)據(jù)類型(NormalizedString Data Type)規(guī)格化字符串?dāng)?shù)據(jù)類型源自于字符串?dāng)?shù)據(jù)類型。規(guī)格化字符串?dāng)?shù)據(jù)類型同樣可包含字符,但是 XML 處理器會移除折行,回車以及制表符。下面是一個關(guān)于在某個 schema 中規(guī)格化字符串?dāng)?shù)據(jù)類型的例子:<xs:element name="customer" type="xs:normalizedString"/>文檔中的元素看上去應(yīng)該類似這樣:<customer>John Smith</customer>或者類似這樣:<customer> John Smith </customer>注釋:在上面的例子中,XML 處理器會使用空格替換所有的制表符。Token 數(shù)據(jù)類型(Token Data Type)Token 數(shù)據(jù)類型同樣源自于字符串?dāng)?shù)據(jù)類型。Token 數(shù)據(jù)類型同樣可包含字符,但是 XML 處理器會移除換行符、回車、制表符、開頭和結(jié)尾的空格以及(連續(xù)的)空格。下面是在 schema 中一個有關(guān) token 聲明的例子:<xs:element name="customer" type="xs:token"/>文檔中的元素看上去應(yīng)該類似這樣:<customer>John Smith</customer>或者類似這樣:<customer> John Smith </customer>注釋:在上面這個例子中,XML 解析器會移除制表符。字符串?dāng)?shù)據(jù)類型請注意,所有以下的數(shù)據(jù)類型均衍生于字符串?dāng)?shù)據(jù)類型(除了字符串?dāng)?shù)據(jù)類型本身)!名稱描述
    E?NTITIES?
    ENTITY?實(shí)體類型
    ID在 XML 中提交 ID 屬性的字符串 (僅與 schema 屬性一同使用)
    IDREF在 XML 中提交 IDREF 屬性的字符串(僅與 schema 屬性一同使用)
    IDREFS language包含合法的語言 id 的字符串
    Name包含合法 XML 名稱的字符串
    NCName?
    NMTOKEN在 XML 中提交 NMTOKEN 屬性的字符串 (僅與 schema 屬性一同使用)
    NMTOKENS?
    normalizedString不包含換行符、回車或制表符的字符串
    QName?
    string字符串
    token不包含換行符、回車或制表符、開頭或結(jié)尾空格或者多個連續(xù)空格的字符串
    對字符串?dāng)?shù)據(jù)類型的限定(Restriction)可與字符串?dāng)?shù)據(jù)類型一同使用的限定:? ? enumeration? ? length? ? maxLength? ? minLength? ? pattern (NMTOKENS、IDREFS 以及 ENTITIES 無法使用此約束)? ? whiteSpace

    XSD 日期及時間數(shù)據(jù)類型(Date and Time Data Types)

    日期及時間數(shù)據(jù)類型用于包含日期和時間的值。日期數(shù)據(jù)類型(Date Data Type)日期數(shù)據(jù)類型用于定義日期。日期使用此格式進(jìn)行定義:"YYYY-MM-DD",其中:? ? YYYY 表示年份? ? MM 表示月份? ? DD 表示天數(shù)注釋:所有的成分都是必需的!下面是一個有關(guān) schema 中日期聲明的例子:<xs:element name="start" type="xs:date"/>文檔中的元素看上去應(yīng)該類似這樣:<start>2002-09-24</start>時區(qū)如需規(guī)定一個時區(qū),您也可以通過在日期后加一個 "Z" 的方式,使用世界調(diào)整時間(UTC time)來輸入一個日期 - 比如這樣:<start>2002-09-24Z</start>或者也可以通過在日期后添加一個正的或負(fù)時間的方法,來規(guī)定以世界調(diào)整時間為準(zhǔn)的偏移量 - 比如這樣:<start>2002-09-24-06:00</start>或者:<start>2002-09-24+06:00</start>時間數(shù)據(jù)類型(Time Data Type)時間數(shù)據(jù)類型用于定義時間。時間使用下面的格式來定義:"hh:mm:ss",其中? ? hh 表示小時? ? mm 表示分鐘? ? ss 表示秒注釋:所有的成分都是必需的!下面是一個有關(guān) schema 中時間聲明的例子:<xs:element name="start" type="xs:time"/>文檔中的元素看上去應(yīng)該類似這樣:<start>09:00:00</start>或者類似這樣:<start>09:30:10.5</start>時區(qū)如需規(guī)定一個時區(qū),您也可以通過在時間后加一個 "Z" 的方式,使用世界調(diào)整時間(UTC time)來輸入一個時間 - 比如這樣:<start>09:30:10Z</start>或者也可以通過在時間后添加一個正的或負(fù)時間的方法,來規(guī)定以世界調(diào)整時間為準(zhǔn)的偏移量 - 比如這樣:<start>09:30:10-06:00</start>或者:<start>09:30:10+06:00</start>日期時間數(shù)據(jù)類型(DateTime Data Type)日期時間數(shù)據(jù)類型用于定義日期和時間。日期時間使用下面的格式進(jìn)行定義:"YYYY-MM-DDThh:mm:ss",其中:? ? YYYY 表示年份? ? MM 表示月份? ? DD 表示日? ? T 表示必需的時間部分的起始? ? hh 表示小時? ? mm 表示分鐘? ? ss 表示秒注釋:所有的成分都是必需的!下面是一個有關(guān) schema 中日期時間聲明的例子:<xs:element name="startdate" type="xs:dateTime"/>文檔中的元素看上去應(yīng)該類似這樣:<startdate>2002-05-30T09:00:00</startdate>或者類似這樣:<startdate>2002-05-30T09:30:10.5</startdate>時區(qū)如需規(guī)定一個時區(qū),您也可以通過在日期時間后加一個 "Z" 的方式,使用世界調(diào)整時間(UTC time)來輸入一個日期時間 - 比如這樣:<startdate>2002-05-30T09:30:10Z</startdate>或者也可以通過在時間后添加一個正的或負(fù)時間的方法,來規(guī)定以世界調(diào)整時間為準(zhǔn)的偏移量 - 比如這樣:<startdate>2002-05-30T09:30:10-06:00</startdate>或者:<startdate>2002-05-30T09:30:10+06:00</startdate>持續(xù)時間數(shù)據(jù)類型(Duration Data Type)持續(xù)時間數(shù)據(jù)類型用于規(guī)定時間間隔。時間間隔使用下面的格式來規(guī)定:"PnYnMnDTnHnMnS",其中:? ? P 表示周期(必需)? ? nY 表示年數(shù)? ? nM 表示月數(shù)? ? nD 表示天數(shù)? ? T 表示時間部分的起始 (如果您打算規(guī)定小時、分鐘和秒,則此選項(xiàng)為必需)? ? nH 表示小時數(shù)? ? nM 表示分鐘數(shù)? ? nS 表示秒數(shù)下面是一個有關(guān) schema 中持續(xù)時間聲明的例子:<xs:element name="period" type="xs:duration"/>文檔中的元素看上去應(yīng)該類似這樣:<period>P5Y</period>上面的例子表示一個 5 年的周期。或者類似這樣:<period>P5Y2M10D</period>上面的例子表示一個 5 年、2 個月及 10 天的周期。或者類似這樣:<period>P5Y2M10DT15H</period>上面的例子表示一個 5 年、2 個月、10 天及 15 小時的周期。或者類似這樣:<period>PT15H</period>上面的例子表示一個 15 小時的周期。負(fù)的持續(xù)時間如需規(guī)定一個負(fù)的持續(xù)時間,請?jiān)?P 之前輸入減號:<period>-P10D</period>上面的例子表示一個負(fù) 10 天的周期。日期和時間數(shù)據(jù)類型名稱描述
    date定義一個日期值
    dateTime定義一個日期和時間值
    duration定義一個時間間隔
    gDay定義日期的一個部分 - 天 (DD)
    gMonth定義日期的一個部分 - 月 (MM)
    gMonthDay定義日期的一個部分 - 月和天 (MM-DD)
    gYear定義日期的一個部分 - 年 (YYYY)
    gYearMonth定義日期的一個部分 - 年和月 (YYYY-MM)
    time定義一個時間值
    對日期數(shù)據(jù)類型的限定(Restriction)可與日期數(shù)據(jù)類型一同使用的限定:? ? enumeration? ? maxExclusive? ? maxInclusive? ? minExclusive? ? minInclusive? ? pattern? ? whiteSpace

    XSD 數(shù)值數(shù)據(jù)類型(Numeric Data Types)

    十進(jìn)制數(shù)據(jù)類型用于規(guī)定一個數(shù)值。下面是一個關(guān)于某個 scheme 中十進(jìn)制數(shù)聲明的例子。<xs:element name="prize" type="xs:decimal"/>文檔中的元素看上去應(yīng)該類似這樣:<prize>999.50</prize>或者類似這樣:<prize>+999.5450</prize>或者類似這樣:<prize>-999.5230</prize>或者類似這樣:<prize>0</prize>或者類似這樣:<prize>14</prize>注釋:您可規(guī)定的十進(jìn)制數(shù)字的最大位數(shù)是 18 位。整數(shù)數(shù)據(jù)類型整數(shù)數(shù)據(jù)類型用于規(guī)定無小數(shù)成分的數(shù)值。下面是一個關(guān)于某個 scheme 中整數(shù)聲明的例子。<xs:element name="prize" type="xs:integer"/>文檔中的元素看上去應(yīng)該類似這樣:<prize>999</prize>或者類似這樣:<prize>+999</prize>或者類似這樣:<prize>-999</prize>或者類似這樣:<prize>0</prize>數(shù)值數(shù)據(jù)類型請注意,下面所有的數(shù)據(jù)類型均源自于十進(jìn)制數(shù)據(jù)類型(除 decimal 本身以外)!名字秒數(shù)
    byte有正負(fù)的 8 位整數(shù),表示整型數(shù),大小介于-128和127之間
    decimal十進(jìn)制數(shù)
    int有正負(fù)的 32 位整數(shù),表示整型數(shù),大小介于-2147483648和 2147483647之間
    integer整數(shù)值
    long有正負(fù)的 64 位整數(shù),表示整型數(shù),大小介于-9223372036854775808和9223372036854775807之間
    negativeInteger僅包含負(fù)值的整數(shù) ( .., -2, -1.)
    nonNegativeInteger僅包含非負(fù)值的整數(shù) (0, 1, 2, ..)
    nonPositiveInteger僅包含非正值的整數(shù) (.., -2, -1, 0)
    positiveInteger僅包含正值的整數(shù) (1, 2, ..)
    short有正負(fù)的 16 位整數(shù),表示整型數(shù),大小介于-32768和32767之間
    unsignedLong無正負(fù)的 64 位整數(shù)
    unsignedInt無正負(fù)的 32 位整數(shù)
    unsignedShort無正負(fù)的 16 位整數(shù)
    unsignedByte無正負(fù)的 8 位整數(shù)
    對數(shù)值數(shù)據(jù)類型的限定(Restriction)可與數(shù)值數(shù)據(jù)類型一同使用的限定:? ? enumeration? ? fractionDigits? ? maxExclusive? ? maxInclusive? ? minExclusive? ? minInclusive? ? pattern? ? totalDigits? ? whiteSpace

    XSD 雜項(xiàng)數(shù)據(jù)類型(Miscellaneous Data Types)

    其他雜項(xiàng)數(shù)據(jù)類型包括邏輯、base64Binary、十六進(jìn)制、浮點(diǎn)、雙精度、anyURI、anyURI 以及 NOTATION。邏輯數(shù)據(jù)類型(Boolean Data Type)邏輯數(shù)據(jù)性用于規(guī)定 true 或 false 值。下面是一個關(guān)于某個 scheme 中邏輯聲明的例子:<xs:attribute name="disabled" type="xs:boolean"/>文檔中的元素看上去應(yīng)該類似這樣:<prize disabled="true">999</prize>注釋:合法的布爾值是 true、false、1(表示 true) 以及 0(表示 false)。二進(jìn)制數(shù)據(jù)類型(Binary Data Types)二進(jìn)制數(shù)據(jù)類型用于表達(dá)二進(jìn)制形式的數(shù)據(jù)。我們可使用兩種二進(jìn)制數(shù)據(jù)類型:? ? base64Binary (Base64 編碼的二進(jìn)制數(shù)據(jù))? ? hexBinary (十六進(jìn)制編碼的二進(jìn)制數(shù)據(jù))下面是一個關(guān)于某個 scheme 中 hexBinary 聲明的例子:<xs:element name="blobsrc" type="xs:hexBinary"/>AnyURI 數(shù)據(jù)類型(AnyURI Data Type)anyURI 數(shù)據(jù)類型用于規(guī)定 URI。下面是一個關(guān)于某個 scheme 中 anyURI 聲明的例子:<xs:attribute name="src" type="xs:anyURI"/>文檔中的元素看上去應(yīng)該類似這樣:<pic src="http://www.w3school.com.cn/images/smiley.gif" />注釋:假如某個 URI 含有空格,請用 %20 替換它們。雜項(xiàng)數(shù)據(jù)類型(Miscellaneous Data Types) ?名稱描述
    anyURI?
    base64Binary?
    boolean?
    double?
    float?
    hexBinary?
    NOTATION?
    QName?
    對雜項(xiàng)數(shù)據(jù)類型的限定(Restriction)可與雜項(xiàng)數(shù)據(jù)類型一同使用的限定:? ? enumeration (布爾數(shù)據(jù)類型無法使用此約束*)? ? length (布爾數(shù)據(jù)類型無法使用此約束)? ? maxLength (布爾數(shù)據(jù)類型無法使用此約束)? ? minLength (布爾數(shù)據(jù)類型無法使用此約束)? ? pattern? ? whiteSpace*譯者注:約束指 constraint。

    XML Schema list 元素

    list 元素定義單個 simpleType 定義的集合。該屬性把簡單類型定義為指定數(shù)據(jù)類型的值的一個列表。下面的例子展示了為一列整數(shù)的簡單類型:
  • <?xml version="1.0"?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  • <xs:element name="intvalues" type="valuelist">
  • <xs:simpleType name="valuelist">
  • <xs:list itemType="xs:integer"/>
  • </xs:simpleType>
  • </xs:schema>
  • 文檔中的 "intvalues" 元素類似這樣(注意這個列表有五個列表項(xiàng)):<intvalues>100 34 56 -23 1567</intvalues>注釋:空格被作為列表項(xiàng)的分隔符。

    XML Schema union 元素

    union 元素定義多個 simpleType 定義的集合。從一個特定簡單數(shù)據(jù)類型的集合中選擇定義一個簡單類型元素.
    本例是一個合并了兩個簡單類型的簡單類型:
  • <xs:element name="jeans_size">
  • <xs:simpleType>
  • <xs:union memberTypes="sizebyno sizebystring" />
  • </xs:simpleType>
  • </xs:element>
  • <xs:simpleType name="sizebyno">
  • <xs:restriction base="xs:positiveInteger">
  • <xs:maxInclusive value="42"/>
  • </xs:restriction>
  • </xs:simpleType>
  • <xs:simpleType name="sizebystring">
  • <xs:restriction base="xs:string">
  • <xs:enumeration value="small"/>
  • <xs:enumeration value="medium"/>
  • <xs:enumeration value="large"/>
  • </xs:restriction>
  • </xs:simpleType>
  • XML Schema unique 元素

    ? ??定義和用法? ??unique 元素指定屬性或元素值(或者屬性或元素值的組合)在指定范圍內(nèi)必須是唯一的。 該值必須唯一或?yàn)榱恪?/font>? ??unique 元素必須按順序包含下列元素:? ??selector 元素? ??selector 元素包含 XPath 表達(dá)式,指定一個元素集,在其中由 field 元素指定的值必須唯一。? ??必須有一個且只有一個 selector 元素。? ??field 元素? ??每一個 field 元素均包含一個 XPath 表達(dá)式,指定對于由 selector 元素指定的元素集而言必須唯一的值(屬性或元素值)。? ??如果有多個 field 元素,則 field 元素的組合必須是唯一的。 在此情況下,單個 field 元素的值對于選定元素不一定是唯一的,但所有字段的組合必須是唯一的。? ??必須有一個或多個 field 元素
  • <?xml version="1.0" encoding="UTF-8"?>
  • <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
  • attributeFormDefault="unqualified" targetNamespace="http://www.test.com" xmlns:tn="http://www.test.com">
  • <xs:element name="books">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="book" maxOccurs="unbounded">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="title" type="xs:string"/>
  • <xs:element name="price" type="xs:decimal"/>
  • </xs:sequence>
  • <xs:attribute name="id" type="xs:integer"/>
  • </xs:complexType>
  • </xs:element>
  • </xs:sequence>
  • </xs:complexType>
  • <xs:unique name="bookUnique">
  • <xs:selector xpath="tn:book"/>
  • <xs:field xpath="@id"/>
  • </xs:unique>
  • </xs:element>
  • </xs:schema>
  • <?xml version="1.0" encoding="UTF-8"?>
  • <tn:books xsi:schemaLocation="http://www.test.com t.xsd" xmlns:tn="http://www.test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  • <tn:book id="1">
  • <tn:title>a</tn:title>
  • <tn:price>10</tn:price>
  • </tn:book>
  • <tn:book id="2">
  • <tn:title>a</tn:title>
  • <tn:price>10</tn:price>
  • </tn:book>
  • <tn:book id="1">
  • <tn:title>a</tn:title>
  • <tn:price>10</tn:price>
  • </tn:book>
  • /tn:books>



  • 問題

  • <?xml version="1.0" encoding="UTF-8"?>
  • <xs:schema
  • xmlns:xs="http://www.w3.org/2001/XMLSchema"
  • elementFormDefault="qualified"
  • attributeFormDefault="unqualified"
  • targetNamespace="http://www.test.com"
  • xmlns="http://www.test.com">
  • <xs:attribute name="fk" type="xs:integer"/>
  • <xs:element name="book">
  • <xs:complexType>
  • <xs:sequence>
  • <xs:element name="title" type="xs:string"/>
  • </xs:sequence>
  • <xs:attribute name="id" type="xs:integer"/>
  • <xs:attribute ref="fk"/>
  • </xs:complexType>
  • </xs:element>
  • </xs:schema>
  • <?xml version="1.0" encoding="UTF-8"?>
  • <book xmlns="http://www.test.com"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation="http://www.test.com test.xsd"
  • id="1" fk="fk">
  • <title/>
  • </book>




  • 來自為知筆記(Wiz)

    轉(zhuǎn)載于:https://www.cnblogs.com/java-z/p/3847692.html

    總結(jié)

    以上是生活随笔為你收集整理的Schema详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚州一二区 | 国产一区二区三区视频在线观看 | www.成人国产 | 香蕉手机网 | 美女网站视频在线观看 | 欧美日韩少妇精品 | 国产精品久久久久久久久久久久久久久久久久 | www国产视频 | 农村老熟妇乱子伦视频 | 久久免费视频播放 | 成人宗合 | 亚洲av片在线观看 | www国产精品内射老熟女 | 一区二区网站 | 中文字幕在线观看视频一区二区 | 五月天一区二区 | 91国内 | 久久精品a亚洲国产v高清不卡 | 色婷五月 | 亚洲九九热 | 黄色激情在线观看 | h文在线观看 | 国产精品无码av在线播放 | 亚洲激情一区二区三区 | 91福利视频网 | 一区二区三区黄色片 | 五十路息子 | 亚洲婷婷久久综合 | 国产亚洲欧美日韩精品一区二区三区 | 国产无遮挡免费观看视频网站 | 在线看黄色的网站 | 丰满人妻一区二区三区精品高清 | 日日拍夜夜拍 | 操操操视频| 亚洲精品aⅴ中文字幕乱码 国产精品调教视频 | brazzers欧美一区二区 | 欧美日韩激情视频在线观看 | 欧美另类69xxxx | 91快射 | 天堂中文在线播放 | 国产一卡二卡三卡四卡 | 久久精品国产大片免费观看 | 日韩精品人妻中文字幕有码 | 欧美一二三视频 | 久久免费播放视频 | 中文字幕在线观看免费 | a天堂在线视频 | 国精产品乱码一区一区三区四区 | 色资源网站 | 高清欧美性猛交xxxx黑人猛交 | 国产粉嫩一区二区三区 | 欧美成人精品一区二区三区在线观看 | 国产乱子伦精品无码专区 | 簧片av | 99久久婷婷国产综合精品青牛牛 | 在线成人影视 | 2021av视频 | 三上悠亚在线一区 | 99国产精品视频免费观看一公开 | 国产综合久久久久 | 亚州国产精品视频 | 亚洲性色av | 少妇搡bbbb搡bbb搡澳门 | 欧美福利影院 | 日韩精品一区二区三区久久 | 特级丰满少妇一级aaaa爱毛片 | 131mm少妇做爰视频 | 国产小视频免费在线观看 | 欧美色图亚洲色 | 99久久网站 | 91大神一区二区 | 俺来也俺也啪www色 欧洲一区二区视频 | 国产亚洲精品久久久久久久 | 欧美一区二区福利 | 黄a免费网络 | 亚洲日本在线观看视频 | 亚洲欧美日本另类 | 久久黄色小视频 | 一个色在线视频 | 中文字幕一区二区三区四区五区 | 天堂av在线免费观看 | 伊人影院中文字幕 | 久久久久性色av无码一区二区 | 亚洲品质自拍视频网站 | 波多野一区二区 | 亚洲一区天堂 | 双女主黄文 | 香蕉视频在线免费播放 | 色哟哟免费 | 97色在线视频 | 清纯唯美亚洲综合 | 五月深爱 | 日韩麻豆视频 | 来吧亚洲综合网 | 国产网站在线 | 欧美精品一区二区三区久久久 | 中文字幕无产乱码 | 亚洲激情网址 | 久草免费在线视频 |