XSD基础
XML Schema是以XML语言为基础,与DTD一样是负责定义和描述XML文档结构和内容模式。
DTD缺陷:
- DTD是基于正则表达式的,描述能力有限
- 它没有数据类型的支持,在大多数应用环境下能力不足
- 约束能力不足,无法对XML实例文档做出更细致的语义描述
- DTD的结构化不足,重用的代价较高
- DTD并非使用XML作为描述手段,而它的构建和访问并没有标准的编程接口,无法使用标准的编程方式进行DTD维护
XSD正是对这些DTD缺陷而进行设计的,它的最重要的能力之一就是对数据类型的支持,例如int、float、boolean和date等
XML Schema的两种模式
1. Microsoft XMLSchema
Microsoft XMLSchema模式的Schema文件和其他的XML文件相似,后缀名为.xml,语法如下:
<Schema name="schema-name" xmlns="namespace"> 元素声明部分或属性声明部分 </Schema>2.W3C XML Schema
W3C XML Schema模式的文档元素及属性等全部内容大多数以xsd:开头,也有的以xs:开头,文档后缀名为.xsd,并且根元素必须为xsd:schema,语法如下:
<xsd:schema xmlns:xsd="namespace"> 元素声明部分或属性声明部分 </xsd:schema>
XSD基本结构
一个完整的XSD文档可以由元素、注释、命名空间以及其他节点组成。
例如:
(1)首先创建XSD文件,命名为Node.xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/name" xmlns="http://www.example.com/name" elementFormDefault="qualified"> <xsd:element name="note"> <xsd:complexType> <xsd:sequence> <xsd:element name="to" type="xsd:string" /> <xsd:element name="from" type="xsd:string" /> <xsd:element name="heading" type="xsd:string" /> <xsd:element name="body" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>(2)创建实例文档,命名为work.xml
<?xml version="1.0" encoding="UTF-8"?> <note xmlns="http://www.example.com/name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/name Node.xml"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Do not forget me this weekend!</body> </note>
根元素 schema
可以通过三种形式中任一来声明一个schema<xs xmlns="http://www.w3.org/2001/XMLSchema"> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
targetNamespace属性
XSD的主要目的是声明模式,这些模式由targetNamespace属性里指定的一个命名空间来表示,并不是所有的XML Schema模式都有一个targetNamespace属性。许多XSD定义的模式可以在另一个XSD中使用,或者把模式应用于不需要使用命名空间的文档里。使用方式如下:<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/name" xmlns:target="http://www.example.com/name">
指定元素限定方式的属性
Schema元素中利用elementFormDefault属性和attributeFormDefault属性指定元素的限定方式,因此可以修改元素的默认值。利用这两个属性,可以控制实例文档里元素和属性的默认限定值。在默认情况下,这两个属性的默认属性值是unqualified,它表示非限定的。
创建元素:element
语法如下:
<element name="" type="" ref="" form="" minOccurs="" maxOccurs="" default="" fixed=""> </element>
- name:元素的名称
- type:元素值的类型,可以是内置的数据类型,也可以是其他类型
- ref:对前一个属性定义的引用
- form:利用这个属性可以覆盖元素限定属性的默认值
- minOccurs:定义了element元素在父元素中出现的最少次数。默认值是1
- maxOccurs:定义了element元素在父元素中出现的最多次数。默认值是1
- default:初始默认值
- fixed:不能修改和覆盖的属性固定值
声明simpleType元素
在一个restriction声明中,必须使用base属性定义约束类型。这个属性的值是对全局simpleType定义或者对XSD内置数据类型的引用。例如:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="note"> <xsd:simpleType name="MyInteger"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="10000"/> <xsd:maxInclusive value="99999"/> </xsd:restriction> </xsd:simpleType> </xsd:element> </xsd:schema>
列表类型 list
使用list元素进行声明时,可以使用itemType属性定义列表项的类型,这个属性的值是一个全局的simpleType定义或者XSD类型的引用,这个引用是一个命名空间限定的值,因此它需要前缀。另外,在list元素声明时,还可以建立一个局部的simpleType定义说明itemType的内容。
例如:创建一个名称是MyContactList的全局simpleType类型,表示手机通讯录中可以使用的内容
<xsd:simpleType name="MyContactList"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="username"/> <xsd:enumeration value="qq"/> <xsd:enumeration value="email"/> <xsd:enumeration value="address"/> </xsd:restriction> </xsd:simpleType>上述代码只允许使用一个枚举类型的单个值,如果想要使用多个值,可以创建一个新的类型,然后通过list声明定义一个列表:
<xsd:simpleType name="MyContactListType"> <xsd:list itemType="MyContactList"></xsd:list> </xsd:simpleType>
声明complexType元素
与simpleType元素定义相反的是complexType元素,它用于定义复杂类型,通常也会被称作复合类型。
sequence元素
sequence元素要求组中的元素以指定顺序出现在包含元素中。语法如下:
<sequence id="" maxOccurs="" minOccurs="">
choice元素
choice元素仅仅允许包含在该声明中的元素之一出现在包含的元素中。例如:
<xsd:element name="person"> <xsd:complexType> <xsd:choice> <xsd:element name="employee" type="employee"/> <xsd:element name="member" type="member"/> </xsd:choice> </xsd:complexType> </xsd:element>
声明属性元素:attribute
语法如下:
<attribute name="" default="" fixed="" form="" id="" ref="" type="" use=""> (annotation?,(simpleType?)) </attribute>
- default:可选项,规定属性默认值,default和fixed不可同时出现
- fixed:可选项,规定属性默认值
- form:可选项,规定属性格式
- id:可选项,规定元素的唯一ID
- name:可选项,规定属性的名称
- ref:可选项,规定对指定属性的引用
- type:可选项,规定是内置的数据类型或简单类型,type属性只能在内容不包含simpleType元素时出现
- use:可选项,规定如果使用该属性,有三个值:optional(默认值,属性是可选的并且可以具有任何值)、prohibited(不能够使用属性)、required(属性是必需的)
<xsd:attribute name="code"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="[A-Z][A-Z]"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute>还可以在复杂类型中一个已有的属性中声明一个属性。
<xsd:complexType name="someComplexType"> <xsd:attribute ref="code"/> </xsd:complexType>
将XML Schema文档引入XML中
如果在XSD中定义了命名空间,那么XML文件中需要使用一下代码关联这个XSD文档:
<note xmlns="http://www.example.com/name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/name Node.xml"> </note>
如果XSD文档中没有定义目标命名空间,只是使用了标准命名空间,则:
<note xmlns="http://www.example.com/name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.example.com/name Node.xml"> </note>