XML Schema通过增加更多的数据类型和结构模式来改进DTD,在研究XML Schema的结构模式之前,我们先看看典型的XML Schema根元素:
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dw="http://www.ibm.com/developerWorks/" elementFormDefault="unqualified" attributeFormDefault="unqualified"version="4.0">
相当复杂,其中包含了两个不同的名称空间声明。首先,XML Schema本身的名称空间是以xsd为前缀的,将XML Schema与被约束的元素和属性区分开来。接着,定义了dw命名空间,这个特殊的示例是来自于IBM DeveloperWorks的XML文档模板,dw被用于DeveloperWorks规范构建中。然后,attributeFormDefault和elementFormDefault的值都设置为“unqualified”,这将允许XML实例文档省略元素和属性名称空间的声明。限定名(Qualifications)是一个难于理解的概念,很大程度上是因为在XML中的属性并不属于默认的命名空间,它们必须明确指定属于一个命名空间。最后,version属性的值设置为“4.0”。这是用于指定特定模式的版本,在XML Schema规范中并不使用。名称空间指定xsd前缀,http://www.w3.org/2001/XMLSchema事实上相当于指示器用于指出使用的是哪一个模式规范,而不是明确的version属性。
元素和属性
元素使用element结构来定义。一般情况下,你需要定义自己的数据类型,通过在element元素中嵌套一个complexType标签来指定数据类型,定义元素的名称(通过name属性)。如下所示,这是来自IBM模式的元素定义,这个特定的片段用来约束code元素:
<xsd:elementname="code"> <xsd:annotation> <xsd:documentationxml:lang="en"> <title>Defineacodelisting</title> <desc>Thestylesheetallowscodetobeinlineorsection.</desc> </xsd:documentation> </xsd:annotation> <xsd:complexTypemixed="true"> <xsd:choiceminOccurs="0"maxOccurs="unbounded"> <xsd:elementref="a"/> <xsd:elementref="b"/> <xsd:elementref="br"/> <xsd:elementref="font"/> <xsd:elementref="heading"/> <xsd:elementref="i"/> <xsd:elementref="sub"/> <xsd:elementref="sup"/> </xsd:choice> <xsd:attributename="type'type="inline"use="required"> <xsd:annotation> <xsd:documentationxml:lang="en"> <desc>Thetypeofcodelisting.</desc> </xsd:documentation> </xsd:annotation> </xsd:attribute> <xsd:attributename="width"> <xsd:annotation> <xsd:documentationxml:lang="en"> <desc>Thewidthincharactersofthiscodelisting.</desc> </xsd:documentation> </xsd:annotation> </xsd:attribute> </xsd:complexType> </xsd:element>
从例子中可以看出,提供了元素的名称(code),annotation关键字被用于描述一些基本的注释和文本。注意:annotation关键字很少被用到。试想当你获得一个XML Schema的文档和上术的示例一要,那我会从原来的示例中删除annotation部分。
complexType关键字是告诉Schema解析器,此元素不是预定义的类型。设置mixed属性的值为true,是让模式解析器得知code元素不仅可以有文本内容,还可以有嵌套元素。mixed属性的默认值是false。
下一个choice元素是用于提供一个可选的子元素。如果你忽略了choice元素,并且只是列出了元素,那么就会存在排序问题(元素必须按照在Schema文档中定义的顺序显现出来)。但是,如果使用choice元素,顺序就不是那么重要了。此外,每个元素出现的最小和最大数量没有限制(由minOccurs="unbounded"和maxOccurs="unbounded"负责)。这就使得这些元素可以无需排序出现任意次。对于这些元素的每一个引用(使用ref),必须在Schema文档中的其他地方有定义(还可以有它们自己的complexType,关联到其他元素 )。
最后,使用attribute关键字对type和width属性进行定义和注解。
简单类型
如果是所谓的“简单类型”,你完全可以不使用complexType结构:
<xsd:eleementname=“text-data"type="xsd:string"/>
扩展基本类型
我们常认为简单类型的定义较为简单,但是在XML Schema文档中却提供了更为灵活,更高级的约束。例如,要定义一个colorname元素,你可能想把它设置为一个简单的string类型:
<xsd:elementname="colorname"type="xsd:string"/>
但是,你也可以用XML Schema中的enumeration关键字为colorname元素列举所允许的颜色。在这些情况下,就必须对基本类型进行扩展。但是,在定义元素时你已经限定它为基本类型string,而不是扩展的基本类型,为此就需要使用restriction关键字:
<xsd:simpleTypename="colorname"> <xsd:restrictionbase="xsd:string"> <xsd:enumerationvalue="blue"/> <xsd:enumerationvalue="green"/> <xsd:enumerationvalue="red"/> </xsd:restriction> </xsd:simpleType>
另外,当你使用基本类型并且扩展它时,可以使用extension关键字:
<xsd:elementname="title"> <xsd:complexType> <xsd:simpleContent> <xsd:extensionbase="xsd:string"> <xsd:attributename="isbn"type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>
在这里title元素被定义为简单的string类型,但是添加了一个属性(isbn,也是一个string类型)。
注意:对于Java程序员而言,extension和restriction之间的区别并不是那么明显。我们已经习惯于扩展(即使子类最终给可授受的类型添加限制)。在XML Schema文档中,你可以使用restriction来进一步约束数据类型,并且可以使用extension来增强数据类型。