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元素
创建element元素之后需要添加内容,XSD中定义了一些描述元素内容和属性的数据类型,也可以自定义类型。声明简单类型元素时需要通过simpleType来实现,语法如下:
<simpleType name="" id="">
<annotation | restriction | list | union >...
</simpleType>
限定类型 restriction
在一个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="">
- id:规定元素的唯一ID
- maxOccurs:规定元素在父元素中可以出现的最大次数,默认值是1.如果不想对最大次数设置任何限制,可以使用字符串“unbounded”
- minOccurs:规定元素在福严肃中可以出现的最小次数,默认值是1。如果要指定该any组是可选的,需要将属性值设定为0
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>