XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。
XML Schema规定XML文档实例的结构和每个元素/属性的数据类型。
XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
(did格式化Schema,Schema格式化xml)
1.Schema的新特性
1) Schema基于XML语法
2)Schema可以用能处理XML文档的工具处理
3) Schema大大扩充了数据类型,可以自定义数据类型
4) Schema支持元素的继承—Object-Oriented’
2.XML Schema VS DTD
1)XML Schema符合XML语法结构。
2) DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
3)XML Schema则采用与XML文档同样的合法性验证机制
5) XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
6) XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
7)XML Schema基本上满足了关系模式在数据描述上的需要。
8) XML Schema不能像DTD一样定义实体,比DTD更复杂。
3.Schema 数据类型
1) 简单类型
a) 内置的数据类型(built-in data types)
基本的数据类型
扩展的数据类型
b)用户自定义数据类型(通过simpleType定义)
2)复杂类型(通过complexType定义)
a)基本的数据类型
b)扩展的数据类型
c)数据类型特征
4.Schema 元素类型
a)schema元素:作用:包含已经定义的schema用法:<xs:schema>
b)element元素: 作用:声明一个元素
属性:
– name
– type
– ref
– minOccurs
– maxOccurs
– substitutionGroup
– fixed
– default
例:
<xs:element name="cat" type="xs:string"/> <xs:element name="dog" type="xs:string"/> <xs:complexType name="myType"> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="cat"/> <xs:element ref="dog"/> </xs:sequence> </xs:complexType> <xs:element name="pets" type="myType"/>c)group元素:作用:把一组元素声明组合在一起,以便它们能够一起被复合类型应用 . 属性:name/ref
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:group name="myGroup"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> <xs:element name="age" type="xs:integer"/> </xs:sequence> </xs:group> <xs:element name="person"> <xs:complexType> <xs:group ref="myGroup"/> </xs:complexType> </xs:element> </xs:schema>注:上述例子不用分组也可以实现效果,但即然三个属性描述一个人,就是让它要么出现要么不出现。用分组在好不过了。
d)attribute元素:作用:声明一个属性.属性:name/type/ref/use 必须放在sequence下面
:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:attribute name="id" type="xs:int"/> <xs:group name="myGroup"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> <xs:element name="age" type="xs:integer"/> </xs:sequence> </xs:group> <xs:element name="person" > <xs:complexType> <xs:group ref="myGroup"/> <xs:attribute ref="id"/> </xs:complexType> </xs:element> </xs:schema>e)attributeGroup元素 :作用:把一组属性声明组合在一起,以便可以被复合类型应用. 属性:name/ref
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:attributeGroup name="myAttributeGroup"> <xs:attribute name="hello" type="xs:string" use="required"/> <xs:attribute name="world" type="xs:string" use="optional"/> </xs:attributeGroup> <xs:element name="myElement"> <xs:complexType> <xs:attributeGroup ref="myAttributeGroup"/> </xs:complexType> </xs:element> </xs:schema>f)simpleType元素 作用:定义一个简单类型,它决定了元素和属性值的约束和相关信息。属性:name
内容:应用已经存在的简单类型,三种方式:
1) restrict→限定一个范围
2)list→从列表中选择
3) union→包含一个值的结合
1. 子元素为:<xs:restriction>定义一个约束条件
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:simpleType name="myType"> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="3"/> <!-- <xs:minExclusive value="0"/> <xs:maxInclusive value="100"/> --> </xs:restriction> </xs:simpleType> <xs:element name="hello" type="myType"/> </xs:schema>2. 子元素为:<xs:list>从一个特定数据类型的集合中选择定义一个简单类型元素
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:simpleType name="myType"> <xs:list itemType="xs:date"/> </xs:simpleType> <xs:element name="hello" type="myType"/> </xs:schema>3.子元素为:<xs:union>从一个特定简单数据类型的集合中选择定义一个简单类型元素
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:attribute name="myAttr"> <xs:simpleType> <xs:union memberTypes="value1 value2"/> </xs:simpleType> </xs:attribute> <xs:simpleType name="value1"> <xs:restriction base="xs:positiveInteger"> <xs:enumeration value="46"/> <xs:enumeration value="55"/> <xs:enumeration value="60"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="value2"> <xs:restriction base="xs:string"> <xs:enumeration value="top"/> <xs:enumeration value="middle"/> <xs:enumeration value="bottom"/> </xs:restriction> </xs:simpleType> <xs:element name="hello"> <xs:complexType> <xs:sequence> <xs:element name="welcome" type="xs:string"/> </xs:sequence> <xs:attribute ref="myAttr" use="required"/> </xs:complexType> </xs:element> </xs:schema>g)complexType元素: 作用:定义一个复合类型,它决定了一组元素和属性值的约束和相关信息.属性:name
SimpleType与complexType区别
1)simpleType类型的元素中不能包含元素或者属性
2)当需要声明一个元素的子元素/或属性时,用complexType
3)当需要基于内置的基本数据类型定义一个新的数据类型时, 用simpleType。
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="country"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:int"> <xs:attribute name="sizing" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="us"/> <xs:enumeration value="de"/> <xs:enumeration value="cn"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema>注:simpleContent不能有子元素.也就是说一般用simpleContent定义的话我们就是不希望该元素下有子元素。但可以有属性。大多数情况下。Extension代表元素的类型
h)choice元素:作用:允许唯一的一个元素从一个组中被选择.属性:minOccurs/maxOccurs
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:complexType name="myType"> <xs:choice minOccurs="1" maxOccurs="3"> <xs:element name="hello" type="xs:string"/> <xs:element name="world" type="xs:string"/> </xs:choice> </xs:complexType> <xs:element name="helloworld" type="myType"/>i)sequence元素作用:给一组元素一个特定的序列。属性:minOccurs/maxOccurs
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:complexType name="myType"> <xs:sequence minOccurs="1" maxOccurs="3"> <xs:element name="hello" type="xs:string"/> <xs:element name="world" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="helloworld" type="myType"/> </xs:schema>终结:
例:
<?xml version="1.0" encoding="utf-8"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="student.xsd">
<学生名册 >
<学生 学号="1">
<姓名>张三</姓名>
<性别>男</性别>
<年龄>20</年龄>
</学生>
<学生 学号="2">
<姓名>李四</姓名>
<性别>女</性别>
<年龄>19</年龄>
</学生>
<学生 学号="3">
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>
</学生名册>
<xs:element name="学生名册"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element name="学生"> <xs:complexType> <xs:sequence> <xs:element name="姓名" type="xs:string"/> <xs:element name="性别"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="男"/> <xs:enumeration value="女"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="年龄"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="1"/> <xs:maxInclusive value="150"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute name="学号" type="xs:integer"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element>