概念:
元素如果包含子元素或者是带有属性则被称为 复合类型;反之元素如果仅仅包含数字、字符串或者其他数据等,但不包含任何子元素则称为 简单类型。
转自: http://blog.sina.com.cn/s/blog_4c6245400100bhbq.html
一、最基本的
<?xml version="1.0"?> <greeting>Hello World!!</greeting>
对应的Schema
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="greeting" type="xsd:string"/> </xsd:schema>
二、含有子元素,来个complexType
<customer> <name>teiki</name> <address>No.237, Road Waitan, Shanghai</address> </customer>
对应的Schema
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="customer"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="address" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
三、含有孙元素,直接嵌套也可,还可使用ref简化结构
<?xml version="1.0"?> <customer> <name>Teiki</name> <address> <prefecture>Zhejiang</prefecture> <city>Hangzhou</city> <street>Xilu Road, No.121, 7F</street> </address> </customer>
直接嵌套时的XSD
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="customer"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="address"> <xsd:complexType> <xsd:sequence> <xsd:element name="prefecture" type="xsd:string"/> <xsd:element name="city" type="xsd:string" /> <xsd:element name="street" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
使用Ref的
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="customer"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element ref="address"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="address"> <xsd:complexType> <xsd:sequence> <xsd:element name="prefecture" type="xsd:string"/> <xsd:element name="city" type="xsd:string" /> <xsd:element name="street" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
四、定义相同子元素的数量
maxOccurs的值可以为unbounded,最小值为minOccurs,两者的缺省值都为1
<order> <orderItem>Accounting Book</orderItem> <orderItem>Taxation Book</orderItem> </order>
对应的schema:
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema <xsd:element name="order"> <xsd:complexType> <xsd:sequence> <xsd:element name="orderItem" type="xsd:string" maxOccurs="10" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
五、定义可选项的子元素。 xsd:choice
假如上面的订书数据中,可以用书名或者书号任一一种订购,则实例文档可能如下:
<order> <orderItem> <!--书名订购--> <name>Accounting Book</name> </orderItem> <orderItem> <!--书号订购--> <id>7-5058-3496-7</id> </orderItem> </order>
对应的schema
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="order"> <xsd:complexType> <xsd:sequence> <xsd:element ref="orderItem" maxOccurs="10"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="orderItem"> <xsd:complexType> <xsd:choice> <xsd:element name="name" type="xsd:string"/> <xsd:element name="id" type="xsd:string"/> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema>
这里假定<quantity>值为1时,缺省。
<order> <orderItem> <name>Accounting Book</name> <quantity>2</quantity> </orderItem> <orderItem> <id>7-5058-3496-7</id> </orderItem> </order>
对应的schema
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="order"> <xsd:complexType> <xsd:sequence> <xsd:element ref="orderItem" maxOccurs="10"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="orderItem"> <xsd:complexType> <xsd:sequence> <xsd:choice> <xsd:element name="name" type="xsd:string"/> <xsd:element name="id" type="xsd:string"/> </xsd:choice> <xsd:element name="quantity" type="xsd:string" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
六、内置简单类型
内建于XML Schema的简单类型有44种。他们在XML Schema推荐标准的第二部分中公布,下面这是一张内置类型的层次结构图:
七、自定义简单类型
如果内置简单类型的44种还不能满足要求,怎么办呢?下面学习自定义简单类型。(XML的扩展性充分体现在这里)
<order> <orderItem> <id>7-5058-3496-7</id> <quantity>5</quantity> </orderItem> </order>
ID是一个标准的ISBN编码,我们怎么定义这个ISBN编码呢?
<xsd:simpleType name="idType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/> </xsd:restriction> </xsd:simpleType>
idType是一个自定义的简单类型。
我们对它做了限制:
<xsd:restriction base="xsd:string">代表它是基于一个字符串类型。再用pattern元素来描述该字符串的形式。value="\d{1}-\d{4}-\d{4}-\d{1}"这是一个正则表达式.
利用这个自定义的简单类型,我们可以重新写Schema文档:
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="order"> <xsd:complexType> <xsd:sequence> <xsd:element ref="orderItem" maxOccurs="10"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="orderItem"> <xsd:complexType> <xsd:sequence> <xsd:element name="id" type="idType"/> <xsd:element name="quantity" type="xsd:integer"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:simpleType name="idType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>
假如我们事先确定好ID只有3个,即只有3个ISBN是可选的,那怎么办?我们可以用 enumeration元素来进行列举
<xsd:simpleType name="idType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="7-5058-3496-7"/> <xsd:enumeration value="7-5005-6450-3"/> <xsd:enumeration value="7-3020-6069-7"/> </xsd:restriction> </xsd:simpleType>
再来看订购量quantity的值, 如果我们设定其值必须在1-10之间,该怎么办呢?可以这些自定义一个简单类型。
<xsd:simpleType name="quantityType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1"/> <xsd:maxInclusive value="10"/> </xsd:restriction> </xsd:simpleType>
八、定义属性 xsd:attribute
<order> <orderItem id="7-5058-3496-7"/> </order>
对应的schema
<xsd:element name="orderItem"> <xsd:complexType> <xsd:sequence> <!--空元素--> </xsd:sequence> <!--定义该元素属性--> <xsd:attribute name="id" type="xsd:string"/> </xsd:complexType> </xsd:element>
那么,实例文档中该属性值是必须的还是可有可无的呢?我们可以这样限制:
<xsd:attribute name="id" type="idType" use="required"/>
这里我们讲id属性类型作为一种自定义数据类型idType。而且,用attribute元素的use属性来定义是否是必须的属性。 required是必须值,optional是可选值,prohibited是无属性值。
那么对于属性的缺省值,我们怎么定义呢?比如:
<order>
<orderItem id="4-8443-1780-6" quantity="3"/>
</order>
我们还可以用 attribute元素的另一个属性default来定义:
<xsd:attribute name="quantity" type="xsd:integer" default="1"/>
上面的属性我们定义我们还可以采用属性组的办法来重新改写Schema文档。
<xsd:element name="orderItem"> <xsd:complexType> <xsd:sequence/> <xsd:attributeGroup ref="orderItemAttributes"/> </xsd:complexType> </xsd:element> <xsd:attributeGroup name="orderItemAttributes"> <xsd:attribute name="id" type="idType" use="required"/> <xsd:attribute name="quantity" type="xsd:integer" default="1"/> </xsd:attributeGroup>