1、Schema
1.1、什么是Schema
Schema:原称为XSD(XML Schema Definition),是由微软提出的规范,现成为W3C规范
XML Schema是用一套内置的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。
XML Schema规定XML文档实例的结构和每个元素/属性的数据类型
1.2、体验dtd和schema的不同之处
首先创建一个xml文档
<?xml version="1.0" encoding="UTF-8"?>
<student>
<name>貂蝉</name>
<age>20</age>
</student>
先使用内部的dtd对xml文档做约束
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student[
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<student>
<name>貂蝉</name>
<age>20</age>
</student>
那么如果采用schema如何来编写呢?
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="age" type="xs:int"></xs:element>
<!--定义一个数据类型-->
<xs:complexType name="stuType">
<xs:sequence>
<xs:element ref="name"></xs:element>
<xs:element ref="age"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="student" type="stuType"></xs:element>
</xs:schema>
编写一个xml引用此schema
<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd01.xsd">
<name>关羽</name>
<age>20</age>
</student>
1.3、dtd与Schema的比较
dtd的语法的局限性:
1、dtd使用的是一种语法,而xml使用的是另外一种语法
2、dtd的数据类型是有限的,与我们讲的数据库中数据类型不一致
3、dtd不可以扩展,并且不支持命令空间
Schema的好处:
1、Schema也是遵守xml的语法
2、schema大大扩充了数据类型,也可以自定义自己的数据类型
3、它也支持元素的继承,支持元素组合属性组的概念
4、开发性,多个schema的声明可以应用到一个xml文档中。
1.4、Schema文档的结构
schema文档的结构
引用schema的文档
1.5、Schema中的数据类型(知道即可)
数据类型分类:
简单类型
内置的数据类型(built-in data types)
l基本的数据类型(Primitive Data Types)
l扩展的数据类型(Deriverd Data Types)
用户自定义数据类型(通过simpleType定义)
复杂类型(通过complexType定义)
基本数据类型
数据类型 | 描述 |
---|---|
string | 表示字符串 |
boolean | 布尔型 |
decimal | 代表特定精度的数字 |
float | 表示单精度32位浮点数 |
double | 表示双精度64位浮点数 |
duration | 表示持续时间 |
dateTime | 代表特定的时间 |
time | 代表特定的时间,但是是每天重复的 |
date | 代表日期 |
hexBinary | 代表十六进制数 |
anyURI | 代表一个URI,用来定位文件 |
QName | 代表限定(qualified)名称,即有前缀的字符串 |
扩展的数据类型
数据类型 | 描述 |
---|---|
ID | 用于唯一标识元素 |
IDREF/ IDREFS | 参考ID类型的元素或属性 |
ENTITY/ENTITIES | 实体类型 |
NMTOKEN | NMTOKEN类型 |
NMTOKENS | NMTOKEN类型集 |
long | 表示整型数,大小介于-9223372036854775808 和9223372036854775807之间 |
int | 表示整型数,大小介于-2147483648和 2147483647之间 |
short | 表示整型数,大小介于-32768和32767之间 |
byte | 表示整型数,大小介于-128和127之间 |
NOTATION | 代表 NOTATION类型,QName的派生类型 |
其他数据类型
数据类型 | 描述 |
---|---|
gYear/gYearMonth | 指定格式的日期 |
gMonth/gMonthDay | 指定格式的日期 |
gDay | 指定格式的日期 |
base64Binary | 使用base64-encoded编码的2进制数据 |
language | 语言字符,string的派生 |
Name | 有效的XML字符串,string的派生 |
NCName | Name的派生,字符串中不允许“:” |
negativeInteger | 表示负整数,<= -1 |
positiveInteger | 表示正整数,>=1 |
nonNegativeInteger | >=0,另有nonPositiveInteger表示<=0 |
unsignedLong | 无符号数,还有un…Int、Short、Byte |
数据类型的约束
特性 | 描述 |
---|---|
enumeration | 在指定的数据集中选择,限定用户的选值 |
fractionDigits | 限定最大的小数位,用于控制精度 |
length | 指定数据的长度 |
maxExclusive / minExclusive | 指定数据的最大/小值(小于/大于) |
maxInclusive / minInclusive | 指定数据的最大/小值(小于等于/大于等于) |
maxLength / minLength | 指定长度的最大/小值 |
pattern | 指定数据的显示规范,具体规则见下页 |
whiteSpace | 空白字符的处理:preserve/replace/collapse |
precision | 十进制数据允许的位数 |
scale | 小数部分的位数 |
正则描述
规范 | 描述 |
---|---|
\d | 任意一个数字,如:Chap\dàChap1、Chap9…… |
* | 前的字符任意重复,如:abàb、ab、aaaaab…… |
[ ] | [ ]内的字符集中任意一个,如:[xyz]aàxa、ya、za |
? | ?前的字符出现0或1次 |
+ | + 前的字符至少出现1次 |
- | 指定范围,如:[a-d]yàay、by、cy、dy |
{n} | { }前的字符出现n次,如:a{3}xàaaax |
{min,max} | { }前的字符至少出现min次,至多max次,如:a{1,3}xàax、aax、aaax |
1.5、Schema中的元素类型
•schema、element、attribute、group、attributeGroup
•simpleType
•simpleContent
•complexType
1.5.1、element
案例:xsd02.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>
<!--定义是一个类型-->
<xs:complexType name="heroType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element ref="name"></xs:element>
<xs:element ref="type"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="hero" type="heroType"></xs:element>
<!--定义了一个类型,这个类型中包含多个hero元素-->
<xs:complexType name="herosType">
<xs:sequence maxOccurs="unbounded">
<xs:element ref="hero"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="heros" type="herosType"></xs:element>
</xs:schema>
xml文件引用
<?xml version="1.0" encoding="UTF-8"?>
<heros xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd02.xsd">
<hero>
<name>关羽</name>
<type>战士</type>
</hero>
<hero>
<name>曹操</name>
<type>战士</type>
</hero>
<hero>
<name>亚瑟</name>
<type>战士</type>
</hero>
<hero>
<name>安其拉</name>
<type>法师</type>
</hero>
</heros>
1.5.2、group元素
把一组元素声明组合在一起,以便它们能够一起被复合类型应用
案例,使用group组来进行改写代码
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>
<!--定义一个元素组-->
<xs:group name="myElGroup">
<xs:sequence>
<xs:element ref="name"></xs:element>
<xs:element ref="type"></xs:element>
</xs:sequence>
</xs:group>
<!--定义是一个类型-->
<xs:complexType name="heroType">
<xs:group ref="myElGroup"></xs:group>
</xs:complexType>
<xs:element name="hero" type="heroType"></xs:element>
<!--定义了一个类型,这个类型中包含多个hero元素-->
<xs:complexType name="herosType">
<xs:sequence maxOccurs="unbounded">
<xs:element ref="hero"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="heros" type="herosType"></xs:element>
</xs:schema>
实际上xml文件并不需要发生任何的改变
1.5.3、attribute和attributeGroup
案例1:直接定义属性
<xs:complexType name="heroType">
<xs:group ref="myElGroup"></xs:group>
<xs:attribute name="age" type="xs:int" use="required"></xs:attribute>
<xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute>
<xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute>
</xs:complexType>
然后我们在使用attributeGroup来定义属性组
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义元素-->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="type" type="xs:string"></xs:element>
<!--定义一个元素组-->
<xs:group name="myElGroup">
<xs:sequence>
<xs:element ref="name"></xs:element>
<xs:element ref="type"></xs:element>
</xs:sequence>
</xs:group>
<xs:attributeGroup name="myAttrGroup">
<xs:attribute name="age" type="xs:int" use="required"></xs:attribute>
<xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute>
<xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute>
</xs:attributeGroup>
<!--定义是一个类型-->
<xs:complexType name="heroType">
<xs:group ref="myElGroup"></xs:group>
<xs:attributeGroup ref="myAttrGroup"></xs:attributeGroup>
</xs:complexType>
<xs:element name="hero" type="heroType"></xs:element>
<!--定义了一个类型,这个类型中包含多个hero元素-->
<xs:complexType name="herosType">
<xs:sequence maxOccurs="unbounded">
<xs:element ref="hero"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="heros" type="herosType"></xs:element>
</xs:schema>
1.5.4、simpleType
•作用:定义一个简单类型,它决定了元素和属性值的约束和相关信息
•属性:name
•内容:应用已经存在的简单类型,三种方式:
restriction:限定一个范围
list:从列表中选择
union:包含一个值的结合
案例1:schema文件定义:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="myAge">
<xs:restriction base="xs:int">
<xs:minInclusive value="0"></xs:minInclusive>
<xs:maxInclusive value="100"></xs:maxInclusive>
</xs:restriction>
</xs:simpleType>
<xs:element name="sname" type="xs:string"></xs:element>
<xs:element name="age" type="myAge"></xs:element>
<xs:complexType name="stuType">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element ref="sname"></xs:element>
<xs:element ref="age"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="student" type="stuType">
</xs:element>
</xs:schema>
引用
<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd">
<sname>貂蝉</sname>
<!--此时age中内容必须符合myage的定义要求-->
<age>100</age>
</student>
案例2:
<xs:simpleType name="mybirthday">
<xs:list itemType="xs:date"></xs:list>
</xs:simpleType>
引用
<?xml version="1.0" encoding="UTF-8"?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd">
<sname>貂蝉</sname>
<!--此时age中内容必须符合myage的定义要求-->
<age>100</age>
<birthday>2012-01-22 2018-02-22</birthday>
</student>
案例3:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--定义了一个属性-->
<xs:attribute name="allframesize">
<xs:simpleType>
<!--联合-->
<xs:union>
<xs:simpleType>
<xs:restriction base="roadbikesize"/>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="mountainbikesize"/>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:attribute>
<!--定义了一个simpleType类型-->
<xs:simpleType name="roadbikesize">
<xs:restriction base="xs:positiveInteger">
<xs:enumeration value="16"/>
<xs:enumeration value="20"/>
<xs:enumeration value="28"/>
</xs:restriction>
</xs:simpleType>
<!--定义了一个simpleType类型-->
<xs:simpleType name="mountainbikesize">
<xs:restriction base="xs:string">
<xs:enumeration value="small"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="large"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="name" type="xs:string"></xs:element>
<xs:complexType name="stuType">
<xs:sequence minOccurs="1" maxOccurs="5">
<xs:element ref="name"></xs:element>
</xs:sequence>
<xs:attribute ref="allframesize"></xs:attribute>
</xs:complexType>
<xs:element name="student" type="stuType"></xs:element>
</xs:schema>
引用文件
<?xml version="1.0" encoding="UTF-8"?>
<!--allframesize的值可以是roadbikesize或者mountainbikesize-->
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd04.xsd" allframesize="small">
<name></name>
</student>
1.5.5、complexType和simpleContent元素
complexType:定义一个复合类型,它决定了一组元素和属性值的约束和相关信息
simpleContent:应用于complexType,对它的内容进行约束和扩展。
案例:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="stuType">
<xs:simpleContent>
<!--内容只能放小数-->
<xs:extension base="xs:decimal">
<!--stuType有一个属性sizing-->
<xs:attribute name="sizing" use="required">
<!--属性是基于simpleType类型的-->
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="US"/>
<xs:enumeration value="Euro"/>
<xs:enumeration value="UK"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="student" type="stuType"></xs:element>
</xs:schema>
引用schema文件
<?xml version="1.0" encoding="UTF-8"?>
<student sizing="US" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd05.xsd">
10.1
</student>
总结一下:
SimpleType:基于已有数据类型的扩展
ComplexType:定义一个复合类型
SimpleContent:对ComplexType的内容做限定,这个复合类型没有子元素,只能存在文本或者属性