XML Schema是为了弥补DTD的不足而开发的一种新的用于约束和规范XML文档的标准
XML Schema作用:
定义可出现在文档中的元素定义可出现在文档中的属性
定义哪些元素是子元素
定义子元素的次序
定义子元素的数目
定义元素和属性的数据类型
定义元素和属性的默认值和固定值
XML Schema优点(相对于DTD):
XML Schema 可针对未来的需求进行扩展XML Schema 更完善,功能更强大
XML Schema 基于 XML 编写
XML Schema 支持数据类型
XML Schema 支持命名空间
XML Schema对命名空间的支持:
XML Schema支持命名空间,使用命名空间可以明确表示出XML文档中的元素、属性和其他标记,避免名称冲突带来的问题。
名称冲突,例如:两个不同文档采用同样的元素或属性名称描述两个不同类型的内容
<?xml version="1.0" encoding="utf-8"?> <info> <student> <name>Lucy</name> <age>18</age> </student> <teacher> <name>Brun</name> <age>40</age> </teacher> </info>
上述的 <name> <age> 在 <student> <teacher> 中元素名一样,但针对的对象不同含义
不同,在使用XML文档时,可能出现命名混淆。
不同,在使用XML文档时,可能出现命名混淆。
命名空间采用在元素或属性名之前使用一个唯一的标识符,将不同的标识符对元素或属
性进行划分,是其被设置在不同的空间中。
性进行划分,是其被设置在不同的空间中。
XML为保证标识符的唯一性,使用URI来定义标识符
命名空间的定义:
前置命名法:
语法规则:<元素名 xmlns:标识符="URI">
前置命名法:
语法规则:<元素名 xmlns:标识符="URI">
<?xml version="1.0" encoding="utf-8"?> <student:info xmlns:student="https://www.student.net" xmlns:teacher="https://www.teacher.net"> <student:studentInfo student:id="001"> <student:name>Lucy</student:name> <student:age>18</student:age> </studentInfo> <teacher:teacherInfo> <teacher:name>Brun</teacher:name> <teacher:age>40</teacher:age> </teacher:teacherInfo> </student:info>
上述文档使用student、teacher两个标识符
注意:在使用前置命名法时,需要在文档中每个元素增加命名空间标识符
注意:在使用前置命名法时,需要在文档中每个元素增加命名空间标识符
默认命名法:
语法规则:<标记名 xmlns="URI">
语法规则:<标记名 xmlns="URI">
<?xml version="1.0" encoding="utf-8"?> <info xmlns="https://wwww.default.net" xmlns:teacher="https://www.teacher.net"> <studentInfo id="001"> <name>Lucy</name> <age>18</age> </studentInfo> <teacher:teacherInfo> <teacher:name>Brun</teacher:name> <teacher:age>40</teacher:age> </teacher:teacherInfo> </info>
上述文档中使用xmlns声明了一个默认命名空间,元素中没有使用命名空间前缀的,表示这
些元素在默认命名空间中
些元素在默认命名空间中
XML Schema是基于XML文档编写的,保存文件的扩展名为 .xsd
XML Schema文档结构:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="someURI"> <!-- XML Schema文档中元素及属性 --> <xs:element name="xxx" type="yyy"/> ... </xs:schema>
schema是每个XML Schema文档的根元素
<xs:schema xmlns:xs="someURI"> 表示在XML Schema中使用了命名空间机制,其标识符
为 xs
<xs:schema xmlns:xs="someURI"> 表示在XML Schema中使用了命名空间机制,其标识符
为 xs
将一个定义好的XML Schema文档引入XML文档:
<根元素 xmlns:xsi="someURI"
xsi:noNamespaceSchemaLocation="xsdURI">
xsi:noNamespaceSchemaLocation="xsdURI" : 指定XML Schema文件的路径
<根元素 xmlns:xsi="someURI"
xsi:noNamespaceSchemaLocation="xsdURI">
xsi:noNamespaceSchemaLocation="xsdURI" : 指定XML Schema文件的路径
数据类型:
通过对数据类型的支持,XML Schema:更容易描述允许的文档内容
更容易验证数据的正确性
更容易与来自数据库的数据一起工作
更容易定义数据约束
更容易定义数据模型(数据格式)
更容易在不同数据类型间转换数据
常见数据类型:
integer 整型string 字符串
decimal 十进制
float 单精度32位浮点数
double 双精度64为浮点数
boolean 布尔类型
date 日期类型:YYYY-MM-DD
time 时间类型:hh:mm:ss
dateTime 日期时间类型:YYYY-MM-DDhh:mm:ss
anyURI 元素中包含一个URI
XML Schema限定:
当XML Schema规定的数据类型无法满足需要时,可以为XML元素或者属性自行定义可接受的值类型
XML Schema简单类型:
语法规则:
语法规则:
<xs:simpleType> <xs:restriction base="xs:xxx"> <xs:数据类型细节描述 value="value"> ... </xs:restriction> <xs:simpleType>
数据类型的限定:
enumeration 定义可接受值的一个列表
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。
enumeration 定义可接受值的一个列表
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。
复杂类型:
语法规则:
语法规则:
<xs:complexType> <xs:某个限定作用的元素> <xs:element name="xxx_1" type="xs:yyy_1"/> <xs:element name="xxx_2" type="xs:yyy_2"/> </xs:某个限定作用的元素> </xs:complexType>
XML Schema属性:
属性的定义:<xs:attribute name="xxx" type="xs:yyy"/>
<xs:attribute name="xxx" type="xs:yyy" default="value"/>
<xs:attribute name="xxx" type="xs:yyy" fixed="value"/>
name 表示属性名
type 表示属性数据类型
default 表示默认值
fixed 表示固定值
属性值默认是可选的,若要规定属性值必须要有,则使用use属性:
<xs:attribute name="xxx" type="xs:yyy" use="required"/>
use属性可选值有:
optional 表示属性可有可无,作为为默认值
required 表示属性必须存在
prohibited 表示禁止该属性
<xs:attribute name="xxx" type="xs:yyy" use="required"/>
use属性可选值有:
optional 表示属性可有可无,作为为默认值
required 表示属性必须存在
prohibited 表示禁止该属性
XML Schema元素:
简易元素:
仅包含文本的元素,不包含其他元素或属性
语法规则:<xs:element name="xxx" type="xs:yyy"/>
xxx 表示元素名
yyy 表示元素类型
简易元素的默认值:
语法规则:<xs:element name="xxx" type="xs:yyy" default="value"/>
value 是元素 xxx 的默认值,当未给xxx某个规定值时,value就被分配给该元素
value 是元素 xxx 的默认值,当未给xxx某个规定值时,value就被分配给该元素
简易元素的规定值:
语法规则:<xs:element name="xxx" type="xs:yyy" fixed="value"/>
元素xxx值被规定为value,无法改变
语法规则:<xs:element name="xxx" type="xs:yyy" fixed="value"/>
元素xxx值被规定为value,无法改变
复合元素:
具有属性或其它子元素的元素
具有属性或其它子元素的元素
复合元素的类型(下列类型元素都可以具有属性):
空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
XML Schema中复合元素的定义:
语法规则:
第一种:
语法规则:
第一种:
<xs:element name="xxx"> <xs:complexType> <xs:某个限定作用的元素> <xs:element name="xxx_1" type="xs:yyy_1"/> <xs:element name="xxx_2" type="xs:yyy_2"/> </xs:某个限定作用的元素> </xs:complexType> </xs:element>
第二种:
<xs:element name="xxx" type="someType"/> <xs:complexType name="someType"> <xs:摸个限定作用的元素> <xs:element name="xxx_1" type="xs:yyy_1"/> <xs:element name="xxx_2" type="xs:yyy_2"/> </xs:摸个限定作用的元素> </xs:complexType>
第一种描述方法定义的复合类型只能用于xxx元素,而第二种定义的复合类型可被其他
元素引用,<xs:element name="xxx" type="someType"/>
元素引用,<xs:element name="xxx" type="someType"/>
如果XML Schema中,一个元素在不同位置出现不止一次,可以使用:
<xs:element ref="子元素名">
其中 ref 属性使用已定义的元素,并将其直接指向另一个元素定义模板
<xs:element ref="子元素名">
其中 ref 属性使用已定义的元素,并将其直接指向另一个元素定义模板
常用元素:
element 声明元素simpleType 简单类型
complexType 复杂类型
simpleContent 描述复杂类型中的简单数据内容
complexContent 描述复杂类型中的复杂数据类型
attribute 声明属性
attributeGroup 声明属性组
restriction 设定约束条件
extension 设定扩展内容
all 任意顺序
choice 选择关系
sequence 顺序关系
annotation XML文档注解
documentation annotation子元素,描述注解内容
指示器元素:
Order 指示器:定义元素顺序all 规定子元素可以按照任意顺序出现
choice 规定可出现某个字元素或可出现另一个子元素(非此即彼)
sequence 规定子元素必须按照特定顺序出现
Occurrence 指示器:定义元素出现频率
maxOccurs 规定某个元素可出现的最大次数
minOccurs 规定某个元素可出现的最小次数
<xs:element name="someName", type="someType", maxOccurs="value"/>
<xs:element name="someName", type="someType", minOccurs="value"/>
maxOccurs、minOccurs也可以一起使用
maxOccurs 规定某个元素可出现的最大次数
minOccurs 规定某个元素可出现的最小次数
<xs:element name="someName", type="someType", maxOccurs="value"/>
<xs:element name="someName", type="someType", minOccurs="value"/>
maxOccurs、minOccurs也可以一起使用
Group 指示器:定义相关数批元素
group 元素组
group 元素组
<xs:group name="GroupName"> <xs:Order>(Order指示器在定义group时必须定义) ...(元素组中的元素) </xs:Order> </xs:group>
attributeGroup 属性组
<xs:attributeGroup name="属性组名"> ...(属性组中包含的各个属性的定义) </xs:attributeGroup>
any元素
<xs:any/>;通过未被 schema 规定的元素来拓展 XML 文档
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:any minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> <person> <firstname>David</firstname> <lastname>Smith</lastname> <children> <childname>mike</childname> </children> </person>
anyAttribute元素
<xs:anyAttribute/> : 通过未被 schema 规定的属性来扩展 XML 文档
<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:anyAttribute/> </xs:complexType> </xs:element> <person gender="male"> <firstname>David</firstname> <lastname>Smith</lastname> </person>
元素替换:
<xs:element name="name" type="xs:string"/><xs:element name="navn" substitutionGroup="name"/>
在上面的例子中,"name" 元素是主元素,而 "navn" 元素可替代 "name" 元素,在XML文档
中使用name元素的地方可以使用navn元素替换
注意:
可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主
元素的类型相同,那么就不必规定可替换元素的类型
substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素
全局元素:指 "schema" 元素的直接子元素,而本地元素指嵌套在其他元素中的元素
阻止元素替换:
<xs:element name="name" type="xs:string" block="substitution"/>
<xs:element name="navn" substitutionGroup="name"/>
在XML文档中不能再用navn元素替换name元素