1.XML Schema 的基本概念
2.XML Schema 的数据类型
3.XML Schema 的根元素的声明
4.XML Schema 的元素及属性声明
5.XML Schema 对值的限制
6.综合练习
7.schema验证方式
1.XML Schema 的基本概念
XML Schema 语言有两种类型:MIcosoft开发的Microsoft XML Schema 和 W3C 开发的W3C XML Schema 。
最为正式的XML Schema 语言是由W3C制定的XML Schema规范简称为XSD (XML Schema Definition)
DTD 与XML schema 的适用情况:
DTD适合以下情形:
1.文件是叙述性的,并有混合内容。
2.需要有约束标记之间的关系,特别是子标记的顺序关系,而不是标记本身的文本内容
3.需要使用实体
4.XML文件的使用者对使用的DTD达成一致。
XML Schema 则非常适合下列情形:
1,需要定义数据类型,以便约束标记的文本内容的内部结构
2.不强调子标记的顺序,而是强调其数量
3.标记约束不限于父子关系,还需要考虑祖先及子孙的关系
4.跨越多个文件,命名空间前缀不一致
(XML Schema 是 W3C 标准)
(注明:以上摘自《XML基础教程与实验指导》)
2.XML Schema 的数据类型
分为简单类型和复杂类型:
1)简单类型:
string
decimal 十进制数型,包含任意精度和位数
integer
float
boolean
date | 定义一个日期值 |
dateTime | 定义一个日期和时间值 |
duration | 定义一个时间间隔 |
gDay | 定义日期的一个部分 - 天 (DD) |
gMonth | 定义日期的一个部分 - 月 (MM) |
gMonthDay | 定义日期的一个部分 - 月和天 (MM-DD) |
gYear | 定义日期的一个部分 - 年 (YYYY) |
gYearMonth | 定义日期的一个部分 - 年和月 (YYYY-MM) |
time | 定义一个时间值 |
uri-reference 元素包含了一个URL
2)复杂类型
复杂类型的元素有子元素和属性,也可以有字符内容。共有4种:
- 空元素
- 包含其他元素的元素
- 仅包含文本的元素
- 包含元素和文本的元素
3.XML Schema根元素的声明(内容来自w3c)
<?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 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:
这个片断:
targetNamespace="http://www.w3school.com.cn"
显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。
这个片断:
xmlns="http://www.w3school.com.cn"
指出默认的命名空间是 "http://www.w3school.com.cn"。
这个片断:
elementFormDefault="qualified"
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
4.XML元素及属性声明
1)定义简单元素格式:
<xs:element name="xxx" type="yyy"/>
<xs:element name="lastname" type="xs:string"/> <xs:element name="age" type="xs:integer"/> <xs:element name="dateborn" type="xs:date"/>
简易元素的默认值和固定值
简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是 "red":
<xs:element name="color" type="xs:string" default="red"/>
固定值同样会自动分配给元素,并且您无法规定另外一个值。
在下面的例子中,固定值是 "red":
<xs:element name="color" type="xs:string" fixed="red"/>
下面的例子定义了带有一个限定且名为 "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>
定义属性的语法是:
<xsd:attribute name="属性名" type="基本数据类型" use="条件" />
use的取值可以有:required 、optional、fixed和default
2)复合元素类型(内容参考自:http://www.runoob.com/schema/schema-complex-mixed.html)
1.空元素
<product prodid="1345" />
方法一:
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
方法二:
<xs:element name="product" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
2.仅含元素:
<person>
<firstname>John</firstname>
<lastname>Smith</lastname>
</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>
3.仅含文本
<shoesize country="france">35</shoesize>
解:
<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>
其中
<xs:extension base="xs:integer">
....
....
</xs:extension>
可以换成:
<xs:restriction base="xs:integer">
....
....
</xs:restriction>
4.混合内容
<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</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>
group、all、choice、sequence
(1)group 元素用于定义在复杂类型定义中使用的元素组。
语法格式:
<group name=名称 ref=组名 maxOccurs=数值 minOccurs=数值>
<all|choice|sequence>
</group>
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:group name="custGroup">
<xs:sequence>
<xs:element name="customer" type="xs:string"/>
<xs:element name="orderdetails" type="xs:string"/>
<xs:element name="billto" type="xs:string"/>
<xs:element name="shipto" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:element name="order" type="ordertype"/>
<xs:complexType name="ordertype">
<xs:group ref="custGroup"/>
<xs:attribute name="status" type="xs:string"/>
</xs:complexType>
</xs:schema>
2)all 元素规定子元素能够以任意顺序出现,每个子元素只出现0或1次。
<xs:element name="person">
<xs:complexType>
<xs:all minOccurs="0">
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
(3)choice 仅允许包含在 <choice> 声明中的元素之一出现在包含元素中 。
<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>
(4)sequence 要求组中的元素以指定的顺序出现在包含元素中。每个子元素只能出现1次。
<xs:element name="personinfo">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" 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>
5.对值的限制
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/> --value值为一段匹配文字的正则表达式
</xs:restriction>
</xs:simpleType>
</xs:element>
6.综合练习
题目如下:
- 为一个汽车的列表创建一个DTD,每一个car有子元素make、model、year、color、engine、number_of_doors、transmission_type和accessories。 元素engine有子元素number_of_cylinders和fuel_system(其值有两种carbureted和fuel-injected)。 元素accessories有属性radio、air_conditioning、power_windows、power_steering和power_brakes,以上属性均是必须的,且值为yes和no。 将现在流行汽车的名字声明为实体。 注意:上述有的条件限制用 DTD 无法实现,DTD跳过即可,需用第三题的 Schema 技术。
- 创建一个至少包含3个题目1中car元素实例的XML文档。用练习1中的 DTD 来处理该文档,验证有效性。
- 为练习1和练习2中描述的XML文档创建一个XML Schema,Schema 的使用自学课本第7章和网络教程(见下方参考教程地址)。
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qulified" >
<!-- 逻辑结构 -->
<xs:element name="cars" >
<xs:complexType>
<xs:sequence>
<xs:element ref="car" />
</xs:sequence>
</xs:complexType>
</xs:element>
<!--元素的定义 -->
<xs:element name="car" >
<xs:complexType>
<xs:sequence>
<xs:element ref="make"/>
<xs:element ref="model" />
<xs:element ref="year" />
<xs:element ref="color"/>
<xs:element ref="engine" />
<xs:element ref="number_of_doors"/>
<xs:element ref="transmission_type" />
<xs:element ref="accessories" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="make" type="xs:string"/>
<xs:element name="model" type="xs:string" />
<xs:element name="year" type="xs:date" />
<xs:element name="color" type="xs:string" />
<xs:element name="engine" >
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="number_of_cylinders" use="required"/>
<xs:attribute ref="fuel_system" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="number_of_doors" type="integer" />
<xs:element name="transmission_type" type="xs:string" />
<xs:element name="accessories" >
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="radio" use="required" />
<xs:attribute ref="air_conditioning" use="required" />
<xs:attribute ref="power_windows" use="required"/>
<xs:attribute ref="power_steering" use="required" />
<xs:attribute ref="power_brakes" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!--属性的定义 -->
<xs:attribute name="number_of_cylinders" type="xs:integer" />
<xs:attribute name="fuel_system" >
<xs:simpleType>
<xs:restriction base="xs:string" >
<xs:enumeration value="carbureted" />
<xs:enumeration value="fuel-injected" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="radio" type="yesOrNoType" />
<xs:attribute name="air_conditioning" type="yesOrNoType" />
<xs:attribute name="power_windows" type="yesOrNoType" />
<xs:attribute name="power_steering" type="yesOrNoType" />
<xs:attribute name="power_brakes" type="yesOrNoType"/>
<xs:simpleType name="yesOrNoType" >
<xs:restriction base="xs:string" >
<xs:enumeration value="yes" />
<xs:enumeration value="no" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
依据该schema,在myeclipse里自动生成的模板如下:
<?xml version="1.0" encoding="UTF-8"?>
<cars xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.w3.org/2001/XMLSchema">
<car>
<make>make</make>
<model>model</model>
<year>2001-01-01</year>
<color>color</color>
<engine fuel_system="carbureted" number_of_cylinders="0">engine</engine>
<number_of_doors>0</number_of_doors>
<transmission_type>transmission_type</transmission_type>
<accessories air_conditioning="yes" power_brakes="yes" power_steering="yes" power_windows="yes" radio="yes">accessories</accessories>
</car>
</cars>
7.schema验证的方式
暂时只找到在myeclipse 添加xml shcema ,然后根据其定义的规则自动生成xml模板。过查看生成的模板判断schema是否书写正确。