Schema:原称为XSD(XML Schema Definition),是由微软提出的规范,现成为W3C规范
XML Schema是用一套内置的XML元素和属性建立的,这些元素和属性定义了XML文档的结构和内容模式。
XML Schema规定XML文档实例的结构和每一个元素/属性的数据类型git
首先建立一个xml文档数据库
<?xml version="1.0" encoding="UTF-8"?> <student> <name>貂蝉</name> <age>20</age> </student>
先使用内部的dtd对xml文档作约束ide
<?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如何来编写呢?ui
<?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>
dtd的语法的局限性:spa
一、dtd使用的是一种语法,而xml使用的是另一种语法rest
二、dtd的数据类型是有限的,与咱们讲的数据库中数据类型不一致code
三、dtd不能够扩展,而且不支持命令空间orm
Schema的好处:xml
一、Schema也是遵照xml的语法
二、schema大大扩充了数据类型,也能够自定义本身的数据类型
三、它也支持元素的继承,支持元素组合属性组的概念
四、开发性,多个schema的声明能够应用到一个xml文档中。
schema文档的结构
引用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àChap一、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 |
•schema、element、attribute、group、attributeGroup
•simpleType
•simpleContent
•complexType
案例: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>
把一组元素声明组合在一块儿,以便它们可以一块儿被复合类型应用
案例,使用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:直接定义属性
<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>
•做用:定义一个简单类型,它决定了元素和属性值的约束和相关信息
•属性: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>
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的内容作限定,这个复合类型没有子元素,只能存在文本或者属性