什么是XSD
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
XML Schema:
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
Xml Schema的用途
- 定义一个Xml文档中都有什么元素
- 定义一个Xml文档中都会有什么属性
- 定义某个节点的都有什么样的子节点,可以有多少个子节点,子节点出现的顺序
- 定义元素或者属性的数据类型
- 定义元素或者属性的默认值或者固定值
根元素
schema 声明:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://maven.apache.org/POM/4.0.0"
xmlns="http://maven.apache.org/POM/4.0.0">
...
...
</xs:schema>
xmlns:xs=“http://www.w3.org/2001/XMLSchema” 表示元素和数据类型等定义来自w3,同时它还规定了来自命名空间 w3 的元素和数据类型应该使用前缀 xs:
targetNamespace=“http://maven.apache.org/POM/4.0.0” 显示被此 schema 定义的元素 来自命名空间
xmlns=“http://maven.apache.org/POM/4.0.0” 表示此文档的默认命名空间
elementFormDefault=“qualified” 任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定
在 XML 文档中引用 Schema
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
</project>
规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于"http://maven.apache.org/POM/4.0.0" 这个命名空间。
schemaLocation 属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置
XSD简易元素
- 简易元素定义
name="tag"表示要定义元素的名称 ,type=”xs:string” 表示要定义元素的数据类型,default=”HEAD” 表示定义元素的默认值,minOccurs=“0” 表示XML文档中某个[元素节点] 是否可以不出现,默认值为1,表示必须出现。<xs:element name="tag" minOccurs="0" type="xs:string" default="HEAD"/>
除此之外,简易元素还有几个属性,nillable:表示XML文档中某个[元素取值] 是否可以为空,默认值为false,表示不能为空,fixed: 表示要定义元素的固定值,此元素只可以取这些值 - 简易元素属性
<xs:attribute name="combine.children" type="xs:string"/>
name=”combine.children” 表示要定义属性的名字,type=”xs:string” 表示要定义属性的数据类型,
除此之外,default=”2001-01-11” 表示要定义属性的默认值,fixed=”2001-01-11” 表示要定义属性的固定值,use=”required” 表示此属性是否是必须指定的,即如果不指定就不符合Schema,默认没有use=”required”属性表示属性可有可无 - 简易元素限定
简易元素的限定主要有以下几种类型
限定 | 描述 |
---|---|
enumeration | 定义可接受值的一个列表 |
fractionDigits | 定义所允许的最大的小数位数。必须大于等于0。 |
length | 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。 |
maxExclusive | 定义数值的上限。所允许的值必须小于此值。 |
maxInclusive | 定义数值的上限。所允许的值必须小于或等于此值。 |
maxLength | 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。 |
minExclusive | 定义数值的下限。所允许的值必需大于此值。 |
minInclusive | 定义数值的下限。所允许的值必需大于或等于此值。 |
minLength | 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。 |
pattern | 定义可接受的字符的精确序列。 |
totalDigits | 定义所允许的阿拉伯数字的精确位数。必须大于0。 |
whiteSpace | 定义空白字符(换行、回车、空格以及制表符)的处理方式。 |
最大最小值限定
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/> <xs: minInclusive>表示最小值,包括指定值
<xs:maxInclusive value="120"/> <xs: maxInclusive>表示最大值,包括指定值
</xs:restriction>
</xs:simpleType>
</xs:element>
枚举限定
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
模式约束
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/> 可接受的值只有小写字母 a - z 其中的一个
<xs:pattern value="[A-Z][A-Z][A-Z]"/> 可接受的值是大写字母 A - Z 其中的三个
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>可接受的值是大写或小写字母 a - z 其中的三个
<xs:pattern value="[xyz]"/> 可接受的值是字母 x, y 或 z 中的一个
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/> 可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是 0-9
<xs:pattern value="([a-z])*"/> 可接受的值是 a - z 中零个或多个字母
<xs:pattern value="([a-z][A-Z])+"/> 可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成
<xs:pattern value="male|female"/> 可接受的值是 male 或者 female
<xs:pattern value="[a-zA-Z0-9]{8}"/> 可接受的值是由 8 个字符组成的一行字符,这些字符必须是大写或小写字母 a - z 亦或数字 0 - 9
</xs:restriction>
</xs:simpleType>
</xs:element>
空白字符限定
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/> whiteSpace 限定被设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符
<xs:whiteSpace value="replace"/> whiteSpace 限定被设置为 "replace",这意味着 XML 处理器将替换所有空白字符(换行、回车、空格以及制表符)
<xs:whiteSpace value="collapse"/>whiteSpace 限定被设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)
</xs:restriction>
</xs:simpleType>
</xs:element>
长度限定
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/> 值必须精确到 8 个字符
<xs:minLength value="5"/> 值最小为 5 个字符
<xs:maxLength value="8"/> 最大为 8 个字符
</xs:restriction>
</xs:simpleType>
</xs:element>
XSD复合类型
定义复合元素有两种方法
1、 通过命名此元素,可直接对元素进行声明
<xs:element name="dependencies" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="dependency" minOccurs="0" maxOccurs="unbounded" type="Dependency"/>
</xs:sequence>
</xs:complexType>
</xs:element>
2、元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称
<xs:element name="dependencyManagement" minOccurs="0" type="DependencyManagement">
</xs:element>
<xs:complexType name="DependencyManagement">
<xs:all>
<xs:element name="dependencies" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="dependency" minOccurs="0" maxOccurs="unbounded" type="Dependency"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
-
空元素
<xs:element name="configuration" minOccurs="0"> <xs:complexType> <xs:attribute name="combine.children" type="xs:string"/> <xs:attribute name="combine.self" type="xs:string"/> </xs:complexType> </xs:element>
-
仅含元素
<xs:sequence>。它意味着被定义的元素必须按上面的次序出现在元素中<xs:element name="dependencies" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="dependency" minOccurs="0" maxOccurs="unbounded" type="Dependency"/> </xs:sequence> </xs:complexType> </xs:element>
-
仅含文本
此类型仅包含简易的内容(文本和属性),因此我们要向此内容添加 simpleContent 元素。当使用简易内容时,我们就必须在 simpleContent 元素内定义扩展或限定,就像这样:<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>
-
混合元素
为了使字符数据可以出现在 “letter” 的子元素之间,mixed 属性必须被设置为 “true”<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>
指示器
通过指示器,我们可以控制在文档中使用元素的方式。在XSD中有七种指示器:
Order 指示器:All,Choice,Sequence ;用于定义元素的顺序
Occurrence 指示器:maxOccurs,minOccurs;Occurrence 指示器用于定义某个元素出现的频率。maxOccurs 以及 minOccurs 的默认值均为 1。
Group 指示器:Group name, attributeGroup name;Group 指示器用于定义相关的数批元素。
- All 指示器
<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次<xs:element name="person"> <xs:complexType> <xs:all> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:all> </xs:complexType> </xs:element>
- 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>
- Sequence 指示器
<sequence> 规定子元素必须按照特定的顺序出现:<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>
- maxOccurs 指示器
指示器可规定某个元素可出现的最大次数,如需使某个元素的出现次数不受限制,请使用 maxOccurs=“unbounded” 这个声明<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" type="xs:string" maxOccurs="10"/> </xs:sequence> </xs:complexType> </xs:element>
- minOccurs 指示器
指示器可规定某个元素能够出现的最小次数:<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>
- 元素组指示器
用来定义相关的一组元素。<xs:group name="persongroup"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> </xs:sequence> </xs:group> <xs:element name="person" type="personinfo"/> <xs:complexType name="personinfo"> <xs:sequence> <xs:group ref="persongroup"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType>
- 属性组指示器
用来定义相关的一组属性。<xs:attributeGroup name="personattrgroup"> <xs:attribute name="firstname" type="xs:string"/> <xs:attribute name="lastname" type="xs:string"/> <xs:attribute name="birthday" type="xs:date"/> </xs:attributeGroup> <xs:element name="person"> <xs:complexType> <xs:attributeGroup ref="personattrgroup"/> </xs:complexType> </xs:element>
any元素
通过使用 <any> 元素,我们可以通过任何元素(在 <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:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
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>
substitutionGroup元素替换
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:complexType name="custinfo">
<xs:sequence>
<xs:element ref="name"/>
</xs:sequence>
</xs:complexType>
<xs:element name="customer" type="custinfo"/>
<xs:element name="kunde" substitutionGroup="customer"/>
XSD数据类型
1、XSD字符串
字符串数据类型用于可包含字符串的值,可包含字符、换行、回车以及制表符。
可与字符串数据类型一同使用的限定:enumeration、length、maxLength、minLength、pattern (NMTOKENS、IDREFS 以及 ENTITIES 无法使用此约束)、whiteSpace
名称 | 描述 |
---|---|
ENTITIES | |
ENTITY | |
ID | 在 XML 中提交 ID 属性的字符串 (仅与 schema 属性一同使用) |
IDREF | 在 XML 中提交 IDREF 属性的字符串(仅与 schema 属性一同使用) |
IDREFS | language 包含合法的语言 id 的字符串 |
Name | 包含合法 XML 名称的字符串 |
NCName | |
NMTOKEN | 在 XML 中提交 NMTOKEN 属性的字符串 (仅与 schema 属性一同使用) |
NMTOKENS | |
normalizedString | 不包含换行符、回车或制表符的字符串 |
QName | |
string | 字符串 |
token | 不包含换行符、回车或制表符、开头或结尾空格或者多个连续空格的字符串 |
2、日期和时间类型
名称 | 描述 |
---|---|
date | 定义一个日期值 |
dateTime | 定义一个日期和时间值 |
duration | 定义一个时间间隔 |
gDay | 定义日期的一个部分 - 天 (DD) |
gMonth | 定义日期的一个部分 - 月 (MM) |
gMonthDay | 定义日期的一个部分 - 月和天 (MM-DD) |
gYear | 定义日期的一个部分 - 年 (YYYY) |
gYearMonth | 定义日期的一个部分 - 年和月 (YYYY-MM) |
time | 定义一个时间值 |
3、数值数据类型
可与数值数据类型一同使用的限定:enumeration、fractionDigits、maxExclusive、maxInclusive、minExclusive、minInclusive、pattern、totalDigits、whiteSpace
名字 | 秒数 |
---|---|
byte | 有正负的 8 位整数 |
decimal | 十进制数 |
int | 有正负的 32 位整数 |
integer | 整数值 |
long | 有正负的 64 位整数 |
negativeInteger | 仅包含负值的整数 ( …, -2, -1.) |
nonNegativeInteger | 仅包含非负值的整数 (0, 1, 2, …) |
nonPositiveInteger | 仅包含非正值的整数 (…, -2, -1, 0) |
positiveInteger | 仅包含正值的整数 (1, 2, …) |
short | 有正负的 16 位整数 |
unsignedLong | 无正负的 64 位整数 |
unsignedInt | 无正负的 32 位整数 |
unsignedShort | 无正负的 16 位整数 |
unsignedByte | 无正负的 8 位整数 |
4、杂项数据类型
可与杂项数据类型一同使用的限定:enumeration (布尔数据类型无法使用此约束*)、length (布尔数据类型无法使用此约束)、maxLength (布尔数据类型无法使用此约束)、minLength (布尔数据类型无法使用此约束)、pattern、whiteSpace
名称 | 描述 |
---|---|
anyURI | |
base64Binary | |
boolean | |
double | |
float | |
hexBinary | |
NOTATION | |
QName |