XML系列:XML Schema
一,什么是XML Schema?
1,从XML文档看:
用XML编写的,用于描述XML文档结构,验证XML文档的结构和数据类型有效性的规则。
2,从自身组成来看:
Schema是遵循DTD的XML文档,定义Schema的结构。DTD与分析程序一起验证XML文档的有效性。
3,从数据来看:
是描述数据存储的模型。Schema的二种重要模型:Microsoft XML Schema和W3C XML Schema。
二,XML和DTD
DTD的缺点:
只描述XML文档结构,不支持数据类型检查。
不支持命名空间。
不可扩展性。
数据类型有限。
Schema的优点正是DTD的缺点,另外还有:
使用XML编写,具有XML文档的优点。
可重用性:属性分组,使关系显示化等。
模型化。
可自定义数据类型。
三,Microsoft XML Schema 数据类型
要使用任意一种 XML Schema 数据类型,需指定XML Schema 数据类型的命名空间。
1,内置和派生数据类型:
ID, IDREF, IDREFS
ENTITY, ENTITIES
NMTOKEN ,NMTOKENS
NOTATION
数值类型:
Number:表数字值;
Decimal:表任意精度的十进制数,基础类型是Number;
float和double表浮点数,使用时用Decimal替代。
Integer:表整型,基础类型是Number;
Real:表指数,基础类型是Number;
Binary:表二进制数据的字符串;
字符类型:
String:Unicode字符集。
Char:字符。
日期类型:
DateTime:给定日期的特定时间的字符串。表示格式为CCYY-MM_DDThh:mm:ss的时间。
Date:表示日期。表示CCYY-MM-DD格式的时间。
Time:表示时间,基础类型是DateTime。表示HH:MM:SS格式的时间。
gYearMonth 表示CCYY-MM格式的时间 。
gYear 表示CCYY格式的时间 。
gMonthDay 表示-MM-DD格式的时间 -16-04 。
gDay 表示-DD格式的时间 -16 。
gMonth 表示-MM格式的时间 。
TimePeriod:表DateTime开始和结束之间的时间。
布尔类型:
Boolean:true(数值1) 或 false(数值0);
等;
2, 自定义数据类型。
提供了一种功能强大的复杂数据类型定义机制,可以实现包括结构描述在内的复杂的数据类型。
三,Microsoft XML Schema 中的元素
Schema 中的元素和属性使用 <element> 和 <attribute> 标签来声明。
1,schema元素
XML Schema的根元素,以下为属性:
http://www.w3school.com.cn/schema/el_schema.asp
(1)xmls:建立Schema元素的命名空间。
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
<!-- Schema 主体-->
</xs:schema>
(2)taggetNameSpace:指定用户自己的命名空间,指定该属性的时候要指定xmls为taggetNameSpace中指定的命名空间。
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
taggetNameSpace = "http://www.mySpace.com"
xmls = "http://www.mySpace.com">
<!-- Schema 主体-->
</xs:schema>
(3)elementFormDefault:可选,表用户自己的命名空间中的元素是否受约束(是否遵循本Schema),unqualfied或qualified。
(4)attributeFormDefault:可选,表用户自己的命名空间中的树新风是否受约束(是否遵循本Schema),unqualfied或qualified。
(5)versoin:可选,版本号。
2,element元素
声明元素,以下为常用属性
http://www.w3school.com.cn/schema/el_element.asp
(1)name:元素名;
(2)type:元素数据类型;
(3)ref:引用已定义元素;
(4)fixed:元素值是否可以改变,不能与default一起使用。
(5)default:元素的默认值;
(6)substitutionGroup:表元素的父类;
(7)minOccurs:元素在父元素类型中出现的最少次数:该值可以是大于或等于零的整数,默认值为 1;
(8)maxOccurs :元素在父元素中出现的最多次数:该值可以是大于或等于零的整数,默认值为 1;
若不想对最大次数设置任何限制,使用字符串 "unbounded"。 默认值为 1;
例子:
<?xml version="1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
taggetNameSpace = "http://www.mySpace.com"
xmls = "http://www.mySpace.com">
....
<xs:element name = "name" type = "string" minOcurs = "0" maxOccurs = "*"/>
<xs:element name = "sex" type = "string" minOcurs = "0" maxOccurs = "*"/>
...
</xs:schema>
3,attribute元素
定义一个属性。
http://www.w3school.com.cn/schema/el_attribute.asp
name:属性名。
ref:引用已定义属性。name 和 ref 属性不能同时出现。如果 ref 出现,则 simpleType 元素、form 和 type 不能出现。
type:属性类型,type 属性只能在内容不包含 simpleType 元素时出现。
fixed:属性固定值,不能与default一起使用。
default:属性类型的默认值;
required:属性是否必须,yes或 no;
例子1:
<xs:attribute name = "state" type = "xs:boolean" default = "true" required = "yes"/>
例子2:
<xs:attribute name="code">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:complexType name="someComplexType">
<xs:attribute ref="code"/>
</xs:complexType>
4,simpleType元素
定义一个简单类型,规定与具有纯文本内容的元素或属性的值有关的信息以及对它们的约束。
http://www.w3school.com.cn/schema/el_simpletype.asp
id:唯一标识号;
name:元素名。在所有 simpleType 和 complexType 元素之间必须是唯一的;
如果 simpleType 元素是 schema 元素的子元素,则为必选项,在其他时候则是不允许的。
例子:age元素的约束:值在0 - 100之间。
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
或
<xs:simpleType name = "ageSim">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:element name = "age" type = "ageSim"/>
例子: code属性有一个限定。唯一可接受的值是大写字母 A 到 Z 中的两个字母。
<xs:attribute name="code">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
5,complexType元素
定义复杂类型。复杂类型的元素是包含其他元素和/或属性的 XML 元素。
http://www.w3school.com.cn/schema/el_complextype.asp
例子:
<xs:complexType name = "studentType">
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "sex" type = "xs:string"/>
</xs:sequence>
<xs:attribute name = "state" type = "xs:boolean"/>
<xs:attribute name="code">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:element name = "student" type = "studentType"/>
6,sequence元素
要求子元素必须按顺序出现。每个子元素可出现 0 到任意次数。
http://www.w3school.com.cn/schema/el_sequence.asp
(1)minOccurs:元素在父元素中出现的最少次数:该值可以是大于或等于零的整数,默认值为 1。
要组是可选的,将此属性设置为0。 默认值为 1;
(2)maxOccurs:元素在父元素中出现的最多次数:该值可以是大于或等于零的整数。
最大次数不设置任何限制,使用字符串 "unbounded"。 默认值为 1。
例子:针对 type 元素的声明,可包含零个或多个student 和teacher 元素:
<xs:complexType name = "typeType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name = "student" type = "studentType"/>
<xs:element name = "teacher" type = "teacherType"/>
</xs:sequence>
</xs:complexType>
<xs:element name = "type" type = "typeType">
7,group元素
用于定义在复杂类型定义中使用的元素组;以下为常用属性:
http://www.w3school.com.cn/schema/el_group.asp
(1)name:组名,仅当 schema 元素是该 group 元素的父元素时才使用该属性。
在此情况下,group 是由 complexType、choice 和 sequence 元素使用的模型组。
(2)ref:引用另一个组的名称。 ref 可以包含命名空间前缀。name 属性和 ref 属性不能同时出现。
(3)minOccurs:group 元素可在父元素中出现的最小次数。该值可以是大于或等于零的整数。默认值为 1;
(4)maxOccurs:group 元素可在父元素中出现的最大次数。该值可以是大于或等于零的整数。
若不想对最大次数设置任何限制,使用字符串 "unbounded"。默认值为 1;
例子:
<xs:element name="name" type="xs:string"/>
<xs:element name="sex" type="xs:string"/>
<xs:element name="subject" type="xs:string"/>
<xs:group name="studentGroup">
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="sex"/>
</xs:sequence>
</xs:group>
<xs:complexType name="studentType">
<xs:group ref="studentGroup"/>
</xs:complexType>
<xs:element name = "student" type = "studentType"/>
8,attributeGroup元素
用于对属性声明进行组合,这样这些声明就能够以组合的形式合并到复杂类型中。
http://www.w3school.com.cn/schema/el_attributegroup.asp
name:属性组的名称。name 和 ref 属性不能同时出现。
ref :对指定的属性组的引用。name 和 ref 属性不能同时出现。
例子:
<xs:attributeGroup name = "stuAttGroup">
<xs:attribute name = "state" type = "xs:string"/>
<xs:attribute name = "code">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:attributeGroup>
<xs:group name ="studentGroup">
<xs:sequence>
<xs:element name = "name" type = "xs:string" minOccurs = "0" maxOccurs = "unbounded"/>
<xs:element name = "sex" type = "xs:string" minOccurs = "0" maxOccurs = "unbounded"/>
</xs:sequence>
</xs:group>
<xs:complexType name = "studentType">
<xs:group ref = "studentGroup"/>
<xs:attributeGroup ref = "stuAttGroup"/>
</xs:complexType>
<xs:element name = "student" type = "studentType"/>
1 - 8综合例子:
<?xml version="1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
taggetNameSpace = "http://www.mySpace.com"
xmls = "http://www.mySpace.com">
<xs:element name="name" type="xs:string"/>
<xs:element name="sex" type="xs:string"/>
<xs:element name="subject" type="xs:string"/>
<xs:attribute name="state" type="xs:boolean"/>
<xs:attribute name="code">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:group name="studentGroup">
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="sex"/>
</xs:sequence>
</xs:group>
<xs:group name="teacherGroup">
<xs:sequence>
<xs:group ref="studentGroup"/>
<xs:element ref="subject"/>
</xs:sequence>
</xs:group>
<xs:attributeGroup name="attGroup">
<xs:attribute ref="state"/>
<xs:attribute ref="code"/>
</xs:attributeGroup>
<xs:complexType name="studentType">
<xs:group ref="studentGroup"/>
<xs:attributeGroup ref="attGroup"/>
</xs:complexType>
<xs:complexType name="teacherType">
<xs:group ref="teacherGroup"/>
<xs:attributeGroup ref="attGroup"/>
</xs:complexType>
<xs:element name="student" type="studentType"/>
<xs:element name="teacher" type="teacherType"/>
<xs:complexType name="typeType">
<xs:sequence>
<xs:element ref="student"/>
<xs:element ref="teacher"/>
</xs:sequence>
</xs:complexType>
<xs:element name="type" type="typeType" />
</xs:schema>
9,simpleContent元素
包含对 complexType 元素(它以字符数据或 simpleType 元素为内容)的扩展或限制并且不包含任何元素。
应用于complexType元素中用于包含extension和restriction元素。
父元素: complexType
http://www.w3school.com.cn/schema/el_simpleContent.asp
10,complexContent元素
定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。
父元素 :complexType .
http://www.w3school.com.cn/schema/el_complexcontent.asp
11,extension元素
对 simpleType 或 complexType 的元素进行扩展
http://www.w3school.com.cn/schema/el_extension.asp
例子:通过添加属性,对一个已有的 simpleType 进行扩展:
<xs:simpleType name = "subjectSim">
<xs:restriction base="xs:string">
<xs:enumeration value="数学" />
<xs:enumeration value="语文" />
<xs:enumeration value="科学" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name = "teacherType">
<xs:simpleContent>
<xs:extension base = "subjectSim">
<xs:attribute name = "subject">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="防灾" />
<xs:enumeration value="生理" />
</xs:restriction>
</xs:simpleType>
</xs:attribute >
</xs:extension>
</xs:simpleContent>
</xs:complexType>
例子:对complexType 元素进行扩展
<xs:complexType name = "studentType">
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "sex" type = "xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name = "student" type = "studentType"/>
<xs:complexType name = "teacherType">
<xs:complexContent>
<xs:extension base = "studentType">
<xs:sequence>
<xs:element name = "subject" type = "xs:string"/>
<xs:element name = "wedlock" type = "xs:boolean"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name = "teacher" type = "teacherType"/>
12,restriction元素
定义对 simpleType、simpleContent 或 complexContent 定义的约束。
父元素: complexContent
http://www.w3school.com.cn/schema/el_restriction.asp
id: 可选。规定该元素的唯一的 ID。
base: 必需。规定在该 schema(或由指定的命名空间指示的其他 schema)中定义的内建数据类型、simpleType 或 complexType 元素的名称。
例子:定义对 simpleType定义的约束
<xs:simpleType name = "ageSim">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:element name = "age" type = "ageSim"/>
例子:定义对complexContent 定义的约束
<xs:simpleType name = "ageSimStudent">
<xs:restriction base="xs:integer">
<xs:minInclusive value="13"/>
<xs:maxInclusive value="20"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name = "studentType">
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "sex" type = "xs:string"/>
<xs:element name = "age" type = "ageSimStudent"/>
</xs:sequence>
</xs:complexType>
<xs:element name = "student" type = "studentType"/>
<xs:complexType name = "teacherType">
<xs:complexContent>
<xs:restriction base = "studentType">
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "sex" type = "xs:string"/>
<xs:element name = "age" type = "ageSimStudent" default = "18"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:element name = "teacher" type = "teacherType"/>
例子:定义对 simpleContent 定义的约束
13,list元素
定义单个 simpleType 定义的集合。该属性把简单类型定义为指定数据类型的值的一个列表
http://www.w3school.com.cn/schema/el_list.asp
itemType 在该 schema(或由指定的命名空间指示的其他 schema)中定义的内置数据类型或 simpleType 元素的名称。
包含 list 元素的 simpleType 元素是从 list 值指定的简单类型派生的。
list 值必须是限定名 (QName)。 如果内容包含 simpleType 元素,则不允许使用该属性,否则该属性是必需的。
14,union元素
定义多个 simpleType 定义的集合。
http://www.w3school.com.cn/schema/el_union.asp
15,unique元素
指定属性或元素值(或者属性或元素值的组合)在指定范围内必须是唯一的。 该值必须唯一或为零。
http://www.w3school.com.cn/schema/el_unique.asp
unique 元素必须按顺序包含下列元素:
selector 元素:selector 元素包含 XPath 表达式,指定一个元素集,在其中由 field 元素指定的值必须唯一。
必须有一个且只有一个 selector 元素。
field 元素:每一个 field 元素均包含一个 XPath 表达式,指定对于由 selector 元素指定的元素集而言必须唯一的值(属性或元素值)。
如果有多个 field 元素,则 field 元素的组合必须是唯一的。 在此情况下,单个 field 元素的值对于选定元素不一定是唯一的,但所有字段的组合必须是唯一的。
必须有一个或多个 field 元素。
16,patttern元素
待续