XML SCHEMA教程
本教程是筆者學習W3C的《XML Schema Tutorial》的筆記。如果你對原教程感興趣,可以瀏覽http://www.w3schools.com/schema/default.asp。
XML Schema是W3C制定的基于XML格式的XML文檔結構描述標準。作為一種文檔描述語言,通常我們將其簡寫為XSD(XML Schema Define)。XSD作為DTD(文檔類型定義)的替代者,已經廣泛地應用到各種商業應用。使用XSD,我們不僅可以描述XML文檔的結構以便頒布業務標準,而且可以使用支持XSD的通用化XML解析器對XML文檔進行解析并自動地檢查其是否滿足給定的業務標準。應用XSD校驗XML文檔的結構后,我們不僅驗證了XML文檔的有效性(Well-Formed Document),還驗證了XML文檔的合法性,甚至驗證了XML文檔各域的值合法性(數據類型與編碼值),而且這些驗證工作不必我們編寫任何代碼,只需使用支持XSD的通用化XML文檔解析器即可完成。這就給應用軟件帶來了巨大的靈活性,以前需要借助數據庫或配置文件才能完成的參數化管理,現在只需按照新的業務需求發布新的XML Schema即可。
作為一個入門,下面列出一個XML文檔及其XSD文檔,使我們對XSD有個簡單的認識:
XML:
<?xml version="1.0"?> <note xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> |
XSD:
<?xml version="1.0"?> (1) <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" (2) targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified"> <xs:element name="note"> (3) <xs:complexType> (4) <xs:sequence> (5) <xs:element name="to" type="xs:string"/> (6) <xs:element name="from" type="xs:string"/> (7) <xs:element name="heading" type="xs:string"/> (8) <xs:element name="body" type="xs:string"/> (9) </xs:sequence> </xs:complexType> </xs:element> </xs:schema> |
說明如下:
(1)<?xml version="1.0" ncoding="UTF-8"?>
XML文檔定義,描述本文檔使用的XML標準版本及文檔編碼標準。
(2)<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
l <xs:schema> 是所有XSD文檔的根元素,其屬性描述文檔的名空間及文檔引用;
l xmlns:xs="http://www.w3.org/2001/XMLSchema" 指示使用xs:作前綴的元素、屬性、類型等名稱是屬于http://www.w3.org/2001/XMLSchema名空間的。
l targetNamespace="http://www.w3schools.com" 指示本文檔定義的元素、屬性、類型等名稱屬于http://www.w3schools.com名空間;
l xmlns="http://www.w3schools.com" 指示缺省的名空間是http://www. w3schools.com,即沒有前綴的元素、屬性、類型等名稱是屬于該名空間的。
l elementFormDefault="qualified" 指示使用本XSD定義的XML文檔所使用的元素必須在本文檔中定義且使用名空間前綴。
(3)<xs:element name="note">
定義一個元素,該元素的名稱是note,即XML中的<note>;
(4)<xs:complexType>
<note>元素的類型是復雜類型,具體格式由子元素定義;
(5)<xs:sequence>
<note>元素的子元素必須按順序出現。具體的順序由子元素的定義順序決定;
(6)<xs:element name="to" type="xs:string"/>
定義一個元素<to>,其類型是string,且其是<note>的第1個子元素;
(7)<xs:element name="from" type="xs:string"/>
定義一個元素<from>,其類型是string,且其是<note>的第2個子元素;
(8)<xs:element name="heading" type="xs:string"/>
定義一個元素<heading>,其類型是string,且其是<note>的第3個子元素;
(9)<xs:element name="body" type="xs:string"/>
定義一個元素<body>,其類型是string,且其是<note>的第4個子元素;
上面的說明可以看出我們描述的XML文檔應滿足這些要求:根元素是<note>;<note>可以包含四個子元素,分別是<to>、<from>、<heading>、<body>,且必須按<to>、<from>、<heading>、<body>的順序出現;四個子元素都是string類型的。
1 格式良好文檔
滿足下列要求的XML文檔,稱為格式良好的文檔(Well-Formed Document):
(1) 使用XML定義打頭,如:<?xml version="1.0" encoding="UTF-8"?>;
(2) 文檔僅包含一個唯一的根元素;
(3) 起始標記(<xxx>)必須與結束標記(</xxx>)匹配;
(4) 大小寫敏感;
(5) 所有元素是閉合的(<必須與>配套);
(6) 所有元素嵌套是正確的;
(7) 所有屬性使用""或’’括;
(8) entities must be used for special characters。
應注意到,滿足上述要求的文檔只能算是有效的文檔,但不能算是合法的文檔。例如,業務標準要求文檔中必須包含5個<SEG>元素,如果文檔中僅包含了4個,它仍是格式良好的文檔,但不滿足業務標準要求,是一個非法的文檔。
2 XSD應用的場合
(1) 定義文檔中可以出現的元素;
(2) 定義文檔中可以出現的屬性;
(3) 定義元素包含哪些子元素;
(4) 定義元素出現的順序;
(5) 定義元素出現的次數;
(6) 定義哪些元素是空或可以包含text;
(7) 定義元素與屬性的數據類型;
(8) 定義元素與屬性的缺省值或固定值或值范圍、值列表。
3 XSD相對于 DTD的優勢
(1)XSD支持數據類型;
l 易于描述許可的文檔組成;
l 易于校驗數據的合法性;
l 易于使用數據庫中的數據;
l 易于定義數據的約束;
l 易于定義數據的模式;
l 易于在不同數據類型間進行格式轉換
(2)XSD使用XML語法;
(3)XSD使數據交換更安全,因為它描述了數據的格式,避免了歧義;
(4)XSD可以擴展,支持類型的擴展和結構的擴展。
4 文檔引用
XSD支持名空間(NameSpace)和文檔引用。通過名空間,可以避免文檔引用中可能導致的名稱重復問題。W3C規定XSD的名空間使用URI作為名稱。以前面的XML為例:
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
l xmlns="http://www.w3schools.com" 指示本文檔缺省的名空間,即沒有前綴的所有的元素應在該空間中定義;
l xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 指示本文檔要引用http://www.w3.org/2001/XMLSchema-instance名空間定義的名稱,其前綴是xsi;
l xsi:schemaLocation="http://www.w3schools.com note.xsd" 指示本文檔要引用的http://www.w3schools.com 名空間的XSD文檔是note.xsd。如果要引用多個名空間的XSD文檔,則使用空格分隔多個‘Namespace xsd’對。例如:http://www.acom.com a.xsd http://www.bcom.com b.xsd...。如果XSD文檔沒有使用名空間,則使用xsi:noNamespaceSchemaLocation="note.xsd"代替xsi:schemaLocation。
5 簡單元素描述
簡單元素指只包含text的XML元素,它沒有任何子元素或屬性,如:<sex>男</sex>。簡單元素可以附加地定義其缺省值或固定值。XSD定義簡單元素的格式是:<xs:element name="xxx" type="ttt" [default="defval"] [fixed="fixedval"]>。其中ttt使用XSD標準定義的基本類型,即:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、 xs:time等。例如:<xs:element name=”sex” type=”xs:string” default=”男”>。
使用上述方式定義的簡單元素只能限定元素的數據類型、缺省值、固定值。如果希望限定該簡單元素的取值范圍等約束,則應使用簡單類型定義,并在簡單類型中嵌套值約束子元素。如:
<xs:element name="sex">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
其中,約束的定義方式參考第6節。
6 復雜元素描述
復雜元素指包含屬性或子元素的XML元素,如:<student name=”Li” sex=”男”>,主要包括下列四類:
l 空元素:只包含屬性的元素。如:<student name=”li” />;
l 只包含屬性與子元素的元素。如:
<name type=”realname”>
<firstname>Jack</firstname>
<lastname>Tom</lastname>
</name>
l 只包含屬性與text的元素。如:
<name type=”firstname”>Jack</name>
l 只包含屬性、text和子元素的元素。如:
<name type=”realname”>
Your name is:
<firstname>xxx</firstname>
<lastname>xxx</lastname>
</name>
復雜元素是一種復雜類型,可以使用下面兩種描述方式,一是復合結構,二是分離結構。復合結構,則直接將復雜類型定義為復雜元素的子元素;分離結構則是將復雜類型定義在外部,由復雜元素引用。
l 復合結構
<xs:element name="xxx">
<xs:complexType>
...
</xs:complexType>
</xs:element>
l 分離結構
<xs:element name="xxx" type=”yyy” />
<xs:complexType name=”yyy”>
...
</xs:complexType>
這兩種描述結構也適合于屬性、簡單元素的描述。如果XSD元素中存在大量可復用的自定義數據類型時,建議使用分離式的定義結構。
6.1 數據類型
XSD的數據類型包括基本數據類型、簡單數據類型、復雜數據類型三類?;緮祿愋椭竁3C標準定義的數據類型,主要包括xs:integer、xs:string、xs:date、xs:boolean等。簡單數據類型是基本數據類型的擴展,對取值進行約束;復雜數據類型則是一個復雜的數據結構,通常包含了屬性或子元素定義。
(1) 簡單類型
簡單類型擴展基本數據類型,并對值施加一定的約束。如:
<xs:simpleType name="XSDSimpleType">
<xs:restriction base="dateTime">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
<xs:enumeration value="value3" />
</xs:restriction>
</xs:simpleType>
或
<xs:simpleType name="XSDSimpleType">
<xs:list itemType="dateTime">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
<xs:enumeration value="value3" />
</xs:list>
</xs:simpleType>
或
<xs:simpleType name="XSDSimpleType">
<xs:union memberTypes="dateTime">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
<xs:enumeration value="value3" />
</xs:union>
</xs:simpleType>
(2) 復雜類型
復雜類型通常是復雜元素的數據類型或復雜元素的子元素,描述復雜元素的子元素、屬性以及子元素與屬性的類型。參看后續各小節的描述。
6.2 約束
約束指對簡單類型的元素或屬性施加的值約束條件,主要包含范圍約束、長度約束、枚舉值、模式匹配、空白處理等,是XSD元素或屬性值限制的基礎。
(1) 范圍約束
范圍約束主要施加到數值型、日期型等類型,限制取值的范圍。如:
<xs:restriction
base="xs:integer">
<xs:minInclusive
value="0"/>
<xs:maxInclusive
value="120"/>
</xs:restriction>
上述范圍約束限定的取值范圍是:0<=值<=120。
其他的值范圍約束元素主要包括:
l fractionDigits 設置最大小數位數
l totalDigits 指定精確的數值位數
l maxExclusive 設置數值型的最大值(val < xxx)
l maxInclusive 設置數值型的最大值(val <= xxx)
l minExclusive 設置數值型的最小值(val > xxx)
l minInclusive 設置數值型的最小值(val >= xxx)
(2) 長度約束
長度約束施加到任何類型上限制值的長度,包括<xs:length>固定長度、<xs:maxLength>最大長度、<xs:minLength>最小長度三個限定元素。如:
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
(3) 枚舉值約束
枚舉值約束限制元素或屬性的值只能在給定的值列表中取值,并使用base屬性指示值的數據類型。如:
<xs:restriction base="xs:string">
<xs:enumeration value="CNY"/>
<xs:enumeration value="USD"/>
<xs:enumeration value="JPY"/>
</xs:restriction>
(4) 模式匹配約束
模式匹配約束限制元素或屬性的值應滿足給定的模式要求,并使用base屬性指示值的數據類型。如:
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
以下是些模式匹配的示例:
l [a-z] a-z間的單個字符;
l [A-Z][A-Z] 兩個字符,每個字符都在A-Z間;
l [a-zA-Z] a-z或A-Z間的單個字符;
l [abc] 單個字符 a或b或c;
l ([a-z])* 零個或任意個字符a-z;
l ([a-z][A-Z])+ 一個或任意個字符對,每對字符大小寫間隔出現;
l "a"|"b" 值只能是a或b,與枚舉類似;
l [a-zA-Z0-9]{8} 精確的八個a-z或A-Z或0-9間的字符。
(5) 空白處理約束
空白處理約束限制XML文檔解析器如何處理值的組成空白字符,使用<xs:whitespace>限定元素指示。如:
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
value可能的取值包括:
l replace 刪除內容中的全部空白;
l preserve 保留內容中的全部空白;
l collapse 刪除前導、后導空白,替換內容中的一個或多個空白為一個空格;
6.3 屬性
屬性本身總是定義為簡單類型的。屬性可以指定缺省值、固定值、強制項、約束等屬性。屬性定義格式是:<xs:attribute name="xxx" type="ttt" [default="ddd"] [fixed="fff"] [use="required"] >。
如:
<xs:attribute name="orderid" type="xs:string" use="required"/>
或
<xs:attribute name="orderid" >
<xs:simpleType name="orderIdType">
<xs:restriction base="string">
<xs:pattern value="[A-Z]"d{8}" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
或
<xs:attribute name="orderid" type="orderIdType" />
<xs:simpleType name=" orderIdType">
<xs:restriction base="string">
<xs:pattern value="[A-Z]"d{8}" />
</xs:restriction>
</xs:simpleType>
6.4 空元素描述
空元素通常使用<xs:complexType>描述:
<xs:element name="product">
<xs:complexType>
<xs:attribute
name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
或使用<xs:simpleContent>描述,這種格式通常在元素包含屬性和文本時使用。
<xs:element name="product">
<xs:complexType>
<xs:simpleContent>
<xs:restriction
base="xs:integer">
<xs:attribute
name="prodid" type="xs:positiveInteger"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
或者使用分離結構描述。
6.5 只包含子元素的元素描述
<xs:element name="name">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
或使用分離結構描述。
6.6 只包含text的元素描述
Text總是基本類型或簡單類型的,因此其描述使用擴展基本類型。
<xs:element name="somename">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="basetype">
...
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
使用<xs:extension>擴展基本類型;
或:
<xs:element name="somename">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="basetype">
...
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
使用xs:restriction 擴展類型。
如果元素包含屬性和文本,則描述格式如下:
<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>
6.7 混合結構的元素描述
如果子元素間夾雜了text,則text總被認為是xs:string的,因此只需描述子元素的組成,并使用mixed="true"指示本元素是混合結構的元素。如下列描述:
.xml
<letter>
Dear
Mr.<name>John Smith</name>:
Your order <orderid>1032</orderid>will be shipped on <shipdate>2001-07-13</shipdate>.
Thanks.
</letter>
.xsd
<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>
6.8 類型擴展
XSD使用<xs:extension>擴展一個基本類型、簡單類型或復雜類型。擴展簡單類型主要是增加附加的一些約束,擴展復雜類型則可以增加新的組成元素或屬性。如:
(1)基本類型擴展
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="country" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
(2)復雜類型擴展
<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>
對復雜類型進行擴展,使用<xs:complexContent>,對簡單類型進行擴展使用<xs:simpleContent>。
6.9 復雜類型指令
復雜類型指令控制子元素如何在復雜元素中使用,包括三類指令:順序、次數、分組。
(1) 順序
順序指令控制子元素是否按順序出現,包含三種類型:
l <xs:all>
指示這些子元素最多出現一次,且順序無關(minOccurs=0,maxOccurs=1)。
<xs:complexType name="fullpersoninfo">
<xs:all>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:all>
</xs:complexType>
l <xs:sequencs>
指示這些子元素必須按順序出現。
<xs:complexType name="fullpersoninfo">
<xs:sequencs>
<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>
l <xs:choice>
指示這些子元素只能出現其中一個。
<xs:complexType name="fullpersoninfo">
<xs:choice>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:choice>
</xs:complexType>
(2) 次數
次數指令作為元素的屬性,控制元素可以出現的次數,包含兩個指令:minOccurs、maxOccurs。如:<element name="B2C" type="string" minOccurs="3" maxOccurs="4"></element>
(3) 組
組指令指示一個元素或屬性集合。
元素組使用<xs:group name="xxx">嵌套一個all、choice、sequence指令;定義后,使用<xs:group ref="name">引用元素組。
屬性組使用<xs:attributeGroup name="xxx">嵌套多個<attribute>屬性定義。定義后,使用<xs:attributeGroup ref="name">引用屬性組。
復雜類型還可以使用一些特殊的標記擴展文檔。
l <xs:any minOccurs = "0" > 指示可以在此位置包含任何其他元素;(這些元素也必須在Schema文檔中進行定義)
l <xs:anyAttribute> 指示可以在此位置包含任何其他的屬性。(這些屬性也必須在Schema文檔中進行定義)
6.10 置換組
置換組可以根據用戶需要選擇使用一組元素,其實際的效果相當于給一個元素取了一個別名。如:
<xs:element name="name"
type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
navn是name的置換,因此文檔中使用<name>的位置均可以使用<navn>且<navn>的類型和<name>類型一致。
如果想禁止置換某個元素,可以在定義元素時使用 block="substitution" 屬性。
置換元素和被置換元素必須是全局元素。所謂全局元素就是<xs:schema>元素的直接子元素。嵌套在全局元素中的元素稱為本地元素。(因此,復雜類型定義中總是使用<xs:element ref="name"/>的形式引用全局元素)
6.11 最佳實踐
(1)將可能被共享的元素創建為全局基本元素;(或將全部元素創建為全局元素);
(2)根據各元素的類型創建全局的類型,并設置必要的約束;
(3)組合(引用)全局基本元素形成元素集合(復雜類型);
(4)組合復雜類型為最終的模型。
使用這種模式,適合大型項目,可以共享大量的元素定義,但缺點是由于共享大量的元素定義,可能導致模型比較復雜。
7 實例
下面我們對給定的xml建模其xsd文檔,使用的工具是myEclipse。
.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>John Smith</orderperson> <shipto> <name>Ola Nordmann</name> <address>Langgt 23</address> <city>4000 Stavanger</city> <country>Norway</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> |
(1) 整理文檔的基本格式要求:
l 沒有使用名空間;
l 根元素是shiporder;
l shiporder有一個屬性orderid,類型是整型的;
l shiporder有三個子元素:
n orderperson 是字符串型的;
n shipto是個復雜類型的,且只能出現一次;
n item是復雜類型的,可以出現1次或多次;
l shipto有四個子元素:
n name是字符串型的;
n address是字符串型的;
n city是字符串型的;
n country是字符串型的;
l item有三個子元素:
n title是字符串型的;
n quantity是整型的;
n price是數值型的。
(2) 創建全部元素、屬性為全局元素、
(3)創建各自定義類型的描述;由于我們將全部元素均創建為全局元素,因此在創建類型的組成元素時,我們均創建為對全局元素的引用。另外,注意指定組成元素的出現次數。
(4) 修改xsd的名空間;
(5) 最終形成的文檔如下:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 元素建模 --> <xsd:element name="shiporder" type="shiporderType"></xsd:element> <xsd:element name="orderperson" type="xsd:string"></xsd:element> <xsd:element name="shipto" type="shiptoType"></xsd:element> <xsd:element name="name" type="xsd:string"></xsd:element> <xsd:element name="address" type="xsd:string"></xsd:element> <xsd:element name="city" type="xsd:string"></xsd:element> <xsd:element name="country" type="xsd:string"></xsd:element> <xsd:element name="title" type="xsd:string"></xsd:element> <xsd:element name="quantity" type="xsd:int"></xsd:element> <xsd:element name="price" type="xsd:decimal"></xsd:element> <xsd:element name="item" type="itemType"></xsd:element> <!-- 屬性建模 --> <xsd:attribute name="orderid" type="xsd:long"></xsd:attribute> <!-- 類型建模 --> <xsd:complexType name="shiporderType"> <xsd:sequence> <xsd:element ref="orderperson"></xsd:element> <xsd:element ref="shipto" minOccurs="1" maxOccurs="1"></xsd:element> <xsd:element ref="item" minOccurs="1" maxOccurs="unbounded"> </xsd:element> </xsd:sequence> <xsd:attribute ref="orderid"></xsd:attribute> </xsd:complexType> <xsd:complexType name="shiptoType"> <xsd:sequence> <xsd:element ref="name"></xsd:element> <xsd:element ref="address"></xsd:element> <xsd:element ref="city"></xsd:element> <xsd:element ref="country"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="itemType"> <xsd:sequence> <xsd:element ref="title"></xsd:element> <xsd:element ref="quantity"></xsd:element> <xsd:element ref="price"></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:schema> |
注意:xsd中,xmlns:xsd="http://www.w3.org/2001/XMLSchema"指示全部引用XSD標準定義的名稱使用xsd作為前綴,而前面文章描述中我們使用的前綴是xs,這個差異是工具形成的,都是合法的,甚至我們可以定義前綴是任何我們想要的,換句話說xs并非強制要求的前綴。