XML Schema教程
作者:圈圈 来源:www.jz123.cn 发布时间:2007-1-6 6:09:20 发布人:圈圈
如何写一个最简单的XML Schema文档呢?
首先,我们写出一个最简单的XML文档。
hello.xml
-------------------
<?xml version="1.0"?>
<greeting>Hello World!!</greeting>
<!--一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。-->
hello.xsd
----------
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="greeting" type="xsd:string"/>
</xsd:schema>
XML Schema文档后缀名是.xsd,完全符合XML语法,根元素是schema,命名空间xmlns:xsd="http://www.w3.org/2001/XMLSchema,用元素<element>定义实例文档中的元素,如greeting。
2. 含子元素的Schema文档
假设实例文档是如下的:
customer.xml
-----------
<customer>
<name>teiki</name>
<address>No.237, Road Waitan, Shanghai</address>
</customer>
则可以写出以下的XML Schema文档:
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" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
实例文档customer.xml中,<customer>元素含有两个子元素,所以我们在Schema文档中采用ComplexType来定义该元素。sequence表示子元素依次出现的顺序。
3. 含子元素和孙元素的Schema文档
这次我们给出一个更加复杂一些的文档:
customer.xml
---------------
<customer>
<name>Teiki</name>
<address>
<!-- address追加一个地址子元素 -->
<prefecture>Zhejiang</prefecture>
<city>Hangzhou</city>
<street>Xilu Road, No.121, 7F</street>
</address>
</customer>
为此,我们需要一个更加复杂一点的Schema文档:
address.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"/>
<!-- 追加子元素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>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
不过,我们还可以采用ref元素来重新编写这个Schema文档:
address2.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 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>
使用ref元素可以直接将其指向另一个模块,使文档更加具有可读性。
4. 定义相同子元素的数量
先看这个简单的订购数据实例文档:
order.xml
---------
<order>
<orderItem>Accounting Book</orderItem>
<orderItem>Taxation Book</orderItem>
</order>
假设<orderItem>元素,即每次的订购书目不能超过10种,那该怎么写这个Schema文档呢?这里要用到<element>的maxOccurs属性。
order.xsd
--------------------
<?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>
第7行中的maxOccurs属性为10,代表orderItem元素可以最大有10个。如果,不设定元素个数,则可以用maxOccurs="unbounded"来定义。
类似,如果要定义最小值,可以使用minOccurs,比如下面这句:
<xsd:element name="orderItem" type="xsd:string" minOccurs="5" maxOccurs="10"/>
这两个属性缺省值都是1。
5. 定义可选项的子元素
假如上面的订书数据中,可以用书名或者书号任一一种订购,则实例文档可能如下:
order2.xml
-----------------
<order>
<orderItem>
<!--书名订购-->
<name>Accounting Book</name>
</orderItem>
<orderItem>
<!--书号订购-->
<id>7-5058-3496-7</id>
</orderItem>
</order>
这时书写Schema文档还需要使用choice元素。
order2.xsd
-------------------------
<?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
-----------------
<order>
<orderItem>
<name>Accounting Book</name>
<quantity>2</quantity>
</orderItem>
<orderItem>
<id>7-5058-3496-7</id>
</orderItem>
</order>
这里假定<quantity>值为1时,缺省。
如何修改Schema文档呢?
order3.xsd
-----------------
<?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>
19行中的quantity最少出现值为0,也就是可以有,也可以没有。
当然,也可以直接在<choice>元素中,包含quantity,然后定义它的minOccurs。
6. 内置简单类型
图省略
7. 自定
首先,我们写出一个最简单的XML文档。
hello.xml
-------------------
<?xml version="1.0"?>
<greeting>Hello World!!</greeting>
<!--一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。-->
hello.xsd
----------
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="greeting" type="xsd:string"/>
</xsd:schema>
XML Schema文档后缀名是.xsd,完全符合XML语法,根元素是schema,命名空间xmlns:xsd="http://www.w3.org/2001/XMLSchema,用元素<element>定义实例文档中的元素,如greeting。
2. 含子元素的Schema文档
假设实例文档是如下的:
customer.xml
-----------
<customer>
<name>teiki</name>
<address>No.237, Road Waitan, Shanghai</address>
</customer>
则可以写出以下的XML Schema文档:
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" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
实例文档customer.xml中,<customer>元素含有两个子元素,所以我们在Schema文档中采用ComplexType来定义该元素。sequence表示子元素依次出现的顺序。
3. 含子元素和孙元素的Schema文档
这次我们给出一个更加复杂一些的文档:
customer.xml
---------------
<customer>
<name>Teiki</name>
<address>
<!-- address追加一个地址子元素 -->
<prefecture>Zhejiang</prefecture>
<city>Hangzhou</city>
<street>Xilu Road, No.121, 7F</street>
</address>
</customer>
为此,我们需要一个更加复杂一点的Schema文档:
address.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"/>
<!-- 追加子元素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>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
不过,我们还可以采用ref元素来重新编写这个Schema文档:
address2.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 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>
使用ref元素可以直接将其指向另一个模块,使文档更加具有可读性。
4. 定义相同子元素的数量
先看这个简单的订购数据实例文档:
order.xml
---------
<order>
<orderItem>Accounting Book</orderItem>
<orderItem>Taxation Book</orderItem>
</order>
假设<orderItem>元素,即每次的订购书目不能超过10种,那该怎么写这个Schema文档呢?这里要用到<element>的maxOccurs属性。
order.xsd
--------------------
<?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>
第7行中的maxOccurs属性为10,代表orderItem元素可以最大有10个。如果,不设定元素个数,则可以用maxOccurs="unbounded"来定义。
类似,如果要定义最小值,可以使用minOccurs,比如下面这句:
<xsd:element name="orderItem" type="xsd:string" minOccurs="5" maxOccurs="10"/>
这两个属性缺省值都是1。
5. 定义可选项的子元素
假如上面的订书数据中,可以用书名或者书号任一一种订购,则实例文档可能如下:
order2.xml
-----------------
<order>
<orderItem>
<!--书名订购-->
<name>Accounting Book</name>
</orderItem>
<orderItem>
<!--书号订购-->
<id>7-5058-3496-7</id>
</orderItem>
</order>
这时书写Schema文档还需要使用choice元素。
order2.xsd
-------------------------
<?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
-----------------
<order>
<orderItem>
<name>Accounting Book</name>
<quantity>2</quantity>
</orderItem>
<orderItem>
<id>7-5058-3496-7</id>
</orderItem>
</order>
这里假定<quantity>值为1时,缺省。
如何修改Schema文档呢?
order3.xsd
-----------------
<?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>
19行中的quantity最少出现值为0,也就是可以有,也可以没有。
当然,也可以直接在<choice>元素中,包含quantity,然后定义它的minOccurs。
6. 内置简单类型
图省略
7. 自定
上一篇:Sql语句密码验证的安全漏洞
下一篇:个人主页的建立、宣传与维护