1.最简单的Schema文档
如何写一个最简单的XML Schema文档呢?首先,我们写出一个最简单的XML文档。
hello.xml
一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。
hello.xsd
XML Schema文档后缀名是.xsd,完全符合XML语法,根元素是schema,命名空间xmlns:xsd="http://www.w3.org/2001/XMLSchema,用元素<element>定义实例文档中的元素,如greeting。
2.含子元素的稍复杂Schema文档
假设实例文档是如下的:
customer.xml
则可以写出以下的XML Schema文档:
customer.xsd
实例文档customer.xml中,<customer>元素含有两个子元素,所以我们在Schema文档中采用ComplexType来定义该元素。sequence表示子元素依次出现的顺序。
3.含子元素和孙元素的更复杂Schema文档
这次我们给出一个更加复杂一些的文档:
address.xml
为此,我们需要一个更加复杂一点的Schema文档:
address.xsd
不过,我们还可以采用ref元素来重新编写这个Schema文档:
address2.xsd
使用ref元素可以直接将其指向另一个模块,使文档更加具有可读性。
4.如何定义属性呢?
加入实例文档的元素包含属性,怎么办呢?
customer2.xml
那就这样写Schema文档:
customer2.xsd
很简单,在<sequence>元素定义完成后,再用<attribute>元素id。
5.如何定义相同子元素的数量?
先看这个简单的订购数据实例文档:
order.xml
假设<orderItem>元素,即每次的订购书目不能超过10种,那该怎么写这个Schema文档呢?这里要用到<element>的maxOccurs属性。
order.xsd
第7行中的maxOccurs属性为10,代表orderItem元素可以最大有10个。如果,不设定元素个数,则可以用maxOccurs="unbounded"来定义。类似,如果要定义最小值,可以使用minOccurs,比如下面这句:
这两个属性缺省值都是1。
6.如何定义可选项的子元素?
假如上面的订书数据中,可以用书名或者书号任一一种订购,则实例文档可能如下:
order2.xml
这时书写Schema文档还需要使用choice元素。
order2.xsd
7.稍微更复杂的可选项子元素
再稍微修改一下订书数据的实例文档:
order3.xml
这里假定<quantity>值为1时,缺省。如何修改Schema文档呢?
order3.xsd
19行中的quantity最少出现值为0,也就是可以有,也可以没有。当然,也可以直接在<choice>元素中,包含quantity,然后定义它的minOccurs。
8.内置简单类型
内建于XML Schema的简单类型有44种。他们在XML Schema推荐标准的第二部分中公布,下面这是一张内置类型的层次结构图:
9.自定义简单类型
如果内置简单类型的44种还不能满足要求,怎么办呢?下面学习自定义简单类型。(XML的扩展性充分体现在这里)例如这个实例文档:
order4.xml
ID是一个标准的ISBN编码,我们怎么定义这个ISBN编码呢?
idType是一个自定义的简单类型。我们对它做了限制:<xsd:restriction base="xsd:string">代表它是基于一个字符串类型。再用pattern元素来描述该字符串的形式。value="\d{1}-\d{4}-\d{4}-\d{1}"这是一个正则表达式,关于正则表达式,以后再介绍。嘻嘻!
利用这个自定义的简单类型,我们可以重新写Schema文档:
order4.xsd
假如我们事先确定好ID只有3个,即只有3个ISBN是可选的,那怎么办?我们可以用enumeration元素来进行列举。
再来看订购量quantity的值,如果我们设定其值必须在1-10之间,该怎么办呢?可以这些自定义一个简单类型。
其中,minInclusive,maxInclusive分别代表该类型的取值范围。所以最终修改后的Schema文档如下:
order4-1.xsd
10.定义属性
最后,我们再来讲讲元素的属性如何在Schema文档中定义。比如上面的order.xml实例文档中:
对此,我们在Schema文档中采用一个attribute来定义:
order.xsd
那么,实例文档中该属性值是必须的还是可有可无的呢?我们可以这样限制:
这里我们讲id属性类型作为一种自定义数据类型idType。而且,用attribute元素的use属性来定义是否是必须的属性。required是必须值,optional是可选值,prohibited是无属性值。那么对于属性的缺省值,我们怎么定义呢?比如:
我们还可以用attribute元素的另一个属性default来定义:
所以,我们可以重新写出一个Schema文档:
order2.xsd
上面的属性我们定义我们还可以采用属性组的办法来重新改写Schema文档。
order3.xsd
这个属性组就不详细解释了,不过,大家一看就清楚了吧。最后,我们写一个完整的订书order.xml的Schema文档。
本文转载并整理自: http://bbs.xml.org.cn/dispbbs.asp?boardID=23&ID=7076
如何写一个最简单的XML Schema文档呢?首先,我们写出一个最简单的XML文档。
hello.xml
1 2 |
| <?xml version="1.0"?> <greeting>Hello World!!</greeting> |
hello.xsd
1 2 3 4 |
| <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="greeting" type="xsd:string"/> </xsd:schema> |
2.含子元素的稍复杂Schema文档
假设实例文档是如下的:
customer.xml
1 2 3 4 |
| <customer> <name>teiki</name> <address>No.237, Road Waitan, Shanghai</address> </customer> |
customer.xsd
01 02 03 04 05 06 07 08 09 10 11 |
| <?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> |
3.含子元素和孙元素的更复杂Schema文档
这次我们给出一个更加复杂一些的文档:
address.xml
1 2 3 4 5 6 7 8 9 |
| <customer> <name>Teiki</name> <address> <!-- address追加一个地址子元素 --> <prefecture>Zhejiang</prefecture> <city>Hangzhou</city> <street>Xilu Road, No.121, 7F</street> </address> </customer> |
address.xsd
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 |
| <?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" /> <!-- 追加子元素address--> <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> <!-- end --> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> |
address2.xsd
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 |
| <?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> |
4.如何定义属性呢?
加入实例文档的元素包含属性,怎么办呢?
customer2.xml
1 2 3 4 |
| <customer id="001718"> <name>Teiki</name> <address>No.237, Road Waitan, Shanghai</address> </customer> |
customer2.xsd
01 02 03 04 05 06 07 08 09 10 11 12 13 |
| <?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:attribute name="id" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:schema> |
5.如何定义相同子元素的数量?
先看这个简单的订购数据实例文档:
order.xml
1 2 3 4 |
| <order> <orderItem>Accounting Book</orderItem> <orderItem>Taxation Book</orderItem> </order> |
order.xsd
01 02 03 04 05 06 07 08 09 10 |
| <?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> |
1 |
| <xsd:element name="orderItem" type="xsd:string" minOccurs="5" maxOccurs="10"/> |
6.如何定义可选项的子元素?
假如上面的订书数据中,可以用书名或者书号任一一种订购,则实例文档可能如下:
order2.xml
01 02 03 04 05 06 07 08 09 10 |
| <order> <orderItem> <!--书名订购--> <name>Accounting Book</name> </orderItem> <orderItem> <!--书号订购--> <id>7-5058-3496-7</id> </orderItem> </order> |
order2.xsd
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 |
| <?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> |
再稍微修改一下订书数据的实例文档:
order3.xml
1 2 3 4 5 6 7 8 9 |
| <order> <orderItem> <name>Accounting Book</name> <quantity>2</quantity> </orderItem> <orderItem> <id>7-5058-3496-7</id> </orderItem> </order> |
order3.xsd
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 |
| <?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> |
8.内置简单类型
内建于XML Schema的简单类型有44种。他们在XML Schema推荐标准的第二部分中公布,下面这是一张内置类型的层次结构图:
![](http://hi.csdn.net/attachment/201110/10/0_1318213838nSS4.gif)
9.自定义简单类型
如果内置简单类型的44种还不能满足要求,怎么办呢?下面学习自定义简单类型。(XML的扩展性充分体现在这里)例如这个实例文档:
order4.xml
1 2 3 4 5 6 |
| <order> <orderItem> <id>7-5058-3496-7</id> <quantity>5</quantity> </orderItem> </order> |
1 2 3 4 5 |
| <xsd:simpleType name="idType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/> </xsd:restriction> </xsd:simpleType> |
利用这个自定义的简单类型,我们可以重新写Schema文档:
order4.xsd
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
| <?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> |
1 2 3 4 5 6 7 |
| <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> |
1 2 3 4 5 6 |
| <xsd:simpleType name="quantityType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1"/> <xsd:maxInclusive value="10"/> </xsd:restriction> </xsd:simpleType> |
order4-1.xsd
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
| <?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="quantityType"/> </xsd:sequence> </xsd:complexType> </xsd:element> <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> <xsd:simpleType name="quantityType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1"/> <xsd:maxInclusive value="10"/> </xsd:restriction> </xsd:simpleType> </xsd:schema> |
最后,我们再来讲讲元素的属性如何在Schema文档中定义。比如上面的order.xml实例文档中:
1 2 3 |
| <order> <orderItem id="7-5058-3496-7" /> </order> |
order.xsd
1 2 3 4 5 6 7 8 9 |
| <xsd:element name="orderItem"> <xsd:complexType> <xsd:sequence> <!--空元素--> </xsd:sequence> <!--定义该元素属性--> <xsd:attribute name="id" type="xsd:string"/> </xsd:complexType> </xsd:element> |
1 |
| <xsd:attribute name="id" type="idType" use="required"/> |
1 2 3 |
| <order> <orderItem id="4-8443-1780-6" quantity="3"/> </order> |
1 |
| <xsd:attribute name="quantity" type="xsd:integer" default="1"/> |
order2.xsd
1 2 3 4 5 6 7 |
| <xsd:element name="orderItem"> <xsd:complexType> <xsd:sequence></xsd:sequence> <xsd:attribute name="id" type="idType" use="required"/> <xsd:attribute name="quantity" type="xsd:integer" default="1"/> </xsd:complexType> </xsd:element> |
order3.xsd
01 02 03 04 05 06 07 08 09 10 |
| <xsd:element name="orderItem"> <xsd:complexType> <xsd:sequence></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> |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
| <?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: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> <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> |
本文转载并整理自: http://bbs.xml.org.cn/dispbbs.asp?boardID=23&ID=7076