XML Schema(模式)可以定义DTD中使用的所有结构,它还可以定义比DTD更复杂的数据类型。
Schema文件和其它XML文件的样子非常相似,它是由一组元素构成的,其根元素是“Schema”。
Name :指定该Schema的名称
Xmlns:指定该Schema包含的命名空间。
xmlns:xs="http://www.w3.org/2001/XMLSchema"
该语句定义schema中使用的元素和数据类型schema,element,complexType,
sequence,string,boolean,etc.)属于http://www.w3.org/2001/XMLSchema命令
空间;并指定如果要使用该命名空间中定义的元素和数据类型必须以xs:开头。
targetNamespace="http://www.example.org/XMLSchemaTest"
该语句指定在当前的schema中定义的元素(班级、姓名)是在"http://www.example.org/XMLSchemaTest"命名空间中定义的。
xmlns:tns="http://www.example.org/XMLSchemaTest"
该语句指定默认的命名空间为"http://www.example.org/XMLSchemaTest"
elementFormDefault="qualified"
指定在XML文件中使用的元素必须是该schema中定义的合法元素。
简单元素:只能包含文本内容,不能带有任何其他的元素或属性。
文本的值可以是任何符合XML Schema 定义的基本类型(boolean,string,date,etc.)也可以是用户自己定义的类型。
例如: 元素名 元素类型 default:默认值 (fixed:固定值)
<element name = "color" type = "String" default = "red"/>
在XML Schema中已经预先定义好的数据类型
String:字符串类型 boolean:二元类型的true或falsedate:日期,格式CCYY-MM-DDdatetime:日期和时间
time:24小时格式的时间,可根据时区调整 decimal:任意精度和位数的十进制数integer:整数float:标准的32位浮点数
Schema属性:只有组合元素才有属性,且属性必须定义为简单类型
例如: 属性名 属性类型 default :默认值(fixed:固定值) use设置属性的可选(optional)或必须(required)类型
<attribute name = "xxx" type = "yyy" default = “zzz” use = “optional”/>
限制属性和元素的值
通过restriction关键字结合其他关键字来控制XML中元素或属性可以接受的值
限定值最大值(maxInclusive)和最小值(minInclusive)
指定只能从给出的一组值中进行选择(enumeration)
用pattern关键字通过正则表达式的方式来指定属性或值的取值范围
通过whiteSpace关键字对元素和属性内容中空格的处理
- 通过whiteSpace关键字对元素和属性内容中空格的处理
- 指定值为replace,让xml解析器会将内容中的空格、回车、tab、换行等符号都用空格代替
- 指定值为collapse,让xml解析器会将内容中的空格、回车、tab、换行等符号都用一个空格代替,并取消内容开头和结尾的空格
复合元素:可以包含其他属性和元素的元素称为复合元素,复合元素最好是包含属性的。
Schema——元素出现的顺序
如何定义复合元素:
1、指定元素名
2、通过complexType关键字说明该元素为复合元素
3、指定包含的元素的出现顺序
4、定义具体的元素,这些都是简单元素
Order Indicators该类型的的标示说明包含的元素按照什么顺序出现在XML文档中。
共有三个选择方式:
all 子元素按照任意顺序必须出现一次且就一次。
choice标示器指明不是这个元素出现,就是另一个元素出现。
sequence标示指明其子元素必须按照规定的顺序出现在XML文档中
Schema——元素出现的频率
Occurrence indicators说明元素出现的频率(次数),默认的最大值和最小值都是1
共有两种方式:
maxOccurs 指定某一元素出现的最大次数,如果不限制最大次数maxOccurs="unbounded"
minOccurs 指定某一元素出现的最少次数
Schema——元素组间的关系
Group indicators该类指示器用来指定一系列有关联的元素组
Element groups
将一系列已经定义好的元素放在一个元素组中作为一个组进行定义,且指定了包含的元素的出现顺序,使用的时候直接通过元素组的元素名就可以直接调用包含的所有元素了。
Attribute Groups
将事先申明好的多个属性当成一组来定义
<?xml version="1.0" encoding="UTF-8"?> <!-- Schema文件和其它XML文件的样子非常相似,它是由一组元素构成的,其根元素是“Schema”。 --> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <!-- 复合元素(可以包含其他属性和元素的元素称为复合元素,复合元素最好是包含属性的) 元素名 元素值类型 --> <xs:element name="班级" type="class"/> <!-- 简单元素:只能包含文本内容,不能带有任何其他的元素或属性 元素名 元素值类型(可以是基本类型,也可以自定义)--> <xs:element name="姓名" type="xs:string"/> <!-- 通过complexType关键字说明该元素为复合元素,该复合元素值类型为class --> <xs:complexType name="class"> <!-- 指定包含的元素的出现顺序 --> <xs:sequence> <!-- maxOccurs 指定某一元素出现的最大次数,如果不限制最大次数maxOccurs="unbounded" --> <xs:element name="学生" type="xinxi" maxOccurs="unbounded"/> <xs:element name="老师" type="xinxi" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <!-- 元素名为学生和老师的元素值类型为xinxi,自定义该类型为复合类型 --> <xs:complexType name="xinxi"> <!-- 指定包含的元素的出现顺序 --> <xs:sequence> <!-- 采用ref引用方式来定义元素和属性 。 注意:只能在子元素中采用引用方式定义,在元素中直接引用是不允许的。--> <xs:element ref="姓名"/> <xs:element name="年龄" type="age"/> <xs:element name="电子邮箱" type="email" maxOccurs="unbounded"/> <xs:element name="身高" type="length"/> <!-- choice标示器指明不是这个元素出现,就是另一个元素出现 --> <xs:choice> <xs:element name="电话" type="xs:long" minOccurs="0"/> <xs:element name="手机" type="xs:long" minOccurs="0"/> </xs:choice> <xs:element name="单位"> <xs:complexType> <xs:sequence> <!-- minOccurs 指定某一元素出现的最少次数 --> <xs:element name="地址" type="xs:string" minOccurs="0"/> <xs:element name="邮编" type="xs:long" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <!-- 属性(只有组合元素才有属性,且属性必须定义为简单类型) 通过”use”关键字来设置属性的可选/必须类型 --> <xs:attribute name="编号" type="studentid" use="required"/> </xs:complexType> <!-- 属性名为编号的属性类型为简单类型 --> <xs:simpleType name="studentid"> <!-- 通过restriction关键字结合其他关键字来控制XML中元素或属性可以接受的值 --> <xs:restriction base="xs:string"> <!-- 用pattern关键字通过正则表达式的方式来指定属性或值的取值范围 --> <xs:pattern value="[A-Z]{1}D{3}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="age"> <xs:restriction base="xs:int"> <!-- 限定值最大值(maxInclusive)和最小值(minInclusive) --> <xs:maxExclusive value="29"/> <xs:minExclusive value="18"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="email"> <xs:restriction base="xs:string"> <!-- 用pattern关键字通过正则表达式的方式来指定属性或值的取值范围 --> <xs:pattern value="[A-Z]{20}@{10}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="length"> <xs:restriction base="xs:float"> <!-- 限定值最大值(maxInclusive)和最小值(minInclusive) --> <xs:minExclusive value="140.0"/> <xs:maxExclusive value="190.0"/> </xs:restriction> </xs:simpleType> </xs:schema>