一.应用xml schema的背景
Xml是一种标记性的语言,创建xml文档之前,首先要确立其元素(标记)和结构,再根据结构的定义,填入实际的内容,形成一个xml文档。Xml这样的结构文件有两种方式,即文档类型定义(Document Type Definition ,DTD)和模式定义(Schema)
二.Xml schema较DTD的优点
(1)DTD是一种与xml不同的语法编写,而xml模式是使用一种类xml的语言
(2)DTD中的所有声明都是全局声明,而xml模式则既有全局声明和局部声明
(3)DTD不能对给定的元素或属性的数据类型进行定义,而xml模式具有一套完整的数据类型系统,它允许对数据类型如整型,时间型或字符串型等进行详细的定义
三.详细的例子
该例子是通过xmlSpy进行编写,中间会有对工具相关使用进行简单的介绍。
例子背景:对图书馆中的图书借阅情况进行介绍。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"elementFormDefault="qualified"attributeFormDefault="unqualified">
<xs:annotation>
<xs:documentation>I try to write a whole example</xs:documentation>
</xs:annotation>
<xs:element name="transaction" type="transactionType"/>
<xs:complexType name="transactionType">
<xs:sequence>
<xs:element name="lender" type="addressType"/>
<xs:element name="borrower" type="addressType"/>
<xs:element ref="note"minOccurs="0"/>
<xs:element name="books" type="bookType"/>
</xs:sequence>
<xs:attribute name="data" type="xs:date"/>
</xs:complexType>
<xs:element name="note" type="xs:string"/>
<xs:complexType name="addressType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="state" type="xs:string"/>
</xs:sequence>
<xs:attribute name="phone" type="xs:string" use="optional"/>
</xs:complexType>
<xs:complexType name="bookType">
<xs:sequencemaxOccurs="10"minOccurs="1">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="bookTitle" type="xs:string"/>
<xs:element name="pubDate" type="xs:date"/>
<xs:element name="replacement" type="xs:int"/>
<xs:element name="maxDaysOut" type="xs:int"/>
</xs:sequence>
<xs:attribute name="bookeID" type="ID"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="ID">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-\d{4}-\d{3}"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
3.2将XML Schema作为xml的标记要求,生成对应的XML文件
菜单栏中的DTD/Schema->generate sample XML file,则会根据写好的xml schema来约束需要生成的XML文件。
3.3生成的xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2011 (http://www.altova.com)-->
<transactionxsi:noNamespaceSchemaLocation="Libray.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<lender>
<name>String</name>
<street>String</street>
<city>String</city>
<state>String</state>
</lender>
<borrower>
<name>String</name>
<street>String</street>
<city>String</city>
<state>String</state>
</borrower>
<books>
<book>
<bookTitle>String</bookTitle>
<pubDate>1967-08-13</pubDate>
<replacement>0</replacement>
<maxDaysOut>0</maxDaysOut>
</book>
<book>
<bookTitle>String</bookTitle>
<pubDate>1967-08-13</pubDate>
<replacement>0</replacement>
<maxDaysOut>0</maxDaysOut>
</book>
<book>
<bookTitle>String</bookTitle>
<pubDate>1967-08-13</pubDate>
<replacement>0</replacement>
<maxDaysOut>0</maxDaysOut>
</book>
<book>
<bookTitle>String</bookTitle>
<pubDate>1967-08-13</pubDate>
<replacement>0</replacement>
<maxDaysOut>0</maxDaysOut>
</book>
<book>
<bookTitle>String</bookTitle>
<pubDate>1967-08-13</pubDate>
<replacement>0</replacement>
<maxDaysOut>0</maxDaysOut>
</book>
</books>
</transaction>
当该选项为5时,则在创建时默认的创建为5
四.对所写代码的详细解释
4.1schema的基本结构
在使用XMLspy创建了w3c XML schema文件后,系统默认会进行一些声明如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"elementFormDefault="qualified"attributeFormDefault="unqualified">
</xs:schema>
(1) 从上面代码可以看出,schema文件是以XML声明开头的(即为第一句)。属性xmlns:xs是以url(uniform Resource Locator统一资源定位符,可用来标识别、网页)为其属性值,url声明命名空间。
(2) 在xml schema中应用命名空间:
命名空间的格式为:xmlns:属性名 = “URI”,也可以声明隐式的:
xmlns = “URI”。这里的全局成分指的是元素xs:schema的直接子节点。
(3) elementFormDefault="qualified"指的是只有全局成分才被定义到目标命名空间中,attributeFormDefault="unqualified"指的是非全局属性定义不在目标命名空间中。两者的默认值都是unqualified。
4.2注释
<xs:annotation>
<xs:documentation>
</xs:documentation>
</xs:annotation>
该模式可以加入注释,增强可读性
4.3类型
4.3.1简单类型
W3C定义了44种简单类型:
duration dateTime time date gYearMonth gYear gMonthDay gDay gMonth boolean string base64Binary hexBinary float double decimal anyURI QName NOTATION
(a) 标记为蓝色的string 和decimal都是最常用的简单数据类型,它们可以向下通过限制派生或者列表派生或扩展限制派生可以派生成为其他很多类型。
(b) decimal表示一个十进制数,float表示32位浮点数,double表示64位浮点数
在实例中可以看出用的最多的是简单类型:如xs:date, xs:int, xs:string等等,而下面要讲的自定义简单类型和复杂类型的基础都是简单类型。
4.3.2自定义简单类型
有时可以对各种简单类型进行适当的修改以更好的满足需要。定义过程如下:
(1) 选择一个合适的简单类型作为基类型
(2) 对此基类型添加限制条件。
如实例中的
(a)xs:simpleType即为开始自定义简单类型,在xs:restriction中的属性值即为基类型,子元素即为限制条件。
(b)几种常用的自定义格式(即限制条件的书写格式)
/d:代表任何数字
/D:代表任何非数字的字符
/s:表示空格
/S:表示认识非空格的字符
x*:零或多个x
x?:0或1个X
x+:1或多个X
x{5}:表示5个X
x{5,8}:表示至少5个至多8个X
[0-9]:表示一个0到9的值
上述的/d{3}-/d{4}-/d{3}可以表示成:123-1234-123
4.3.3复杂类型
复杂类型由简单类型和/或其他复杂类型构造的类型分为四种:
(a) 只含元素类型
(b) 只含文本类型
(c) 空元素类型
(d) 混合内容类型
在本例中的复杂类型如下:
<xs:complexType name="transactionType">
<xs:sequence>
<xs:element name="lender" type="addressType"/>
<xs:element name="borrower" type="addressType"/>
<xs:element ref="note"minOccurs="0"/>
<xs:element name="books" type="bookType"/>
</xs:sequence>
<xs:attribute name="data" type="xs:date"/>
</xs:complexType>
(i)复杂类型的子元素有三种排列方式:sequence(顺序出现次序),choice(选择其一方式),all(任意方式)
(ii)xs:attribute表示属性值,应该放在子元素排列方式之外。
五.小结
上述例子可以看出从,xml schema的编写方式和xml很像。Xml schema的关键在于对数据的类型进行定义。所以学好xml schema要专心研究简单类型和负载类型的表示方法。