XML Schema通过增加更多的数据类型和结构模式来改进DTD,在研究XML Schema的结构模式之前,我们先看看典型的XML Schema根元素:
<xsd:schema xmlns: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:element name="code">
<xsd:annotation>
<xsd:documentation xml:lang="en">
<title>Define a code listing</title>
<desc>The stylesheet allows code to be inline or section. </desc>
</xsd:documentation>
</xsd:annotation>
<xsd:complexType mixed="true">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="a" />
<xsd:element ref="b" />
<xsd:element ref="br" />
<xsd:element ref="font" />
<xsd:element ref="heading" />
<xsd:element ref="i" />
<xsd:element ref="sub" />
<xsd:element ref="sup" />
</xsd:choice>
<xsd:attribute name="type' type="inline" use="required">
<xsd:annotation>
<xsd:documentation xml:lang="en">
<desc>The type of code listing. </desc>
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="width">
<xsd:annotation>
<xsd:documentation xml:lang="en">
<desc>The width in characters of this code listing.</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:eleement name=“text-data" type="xsd:string" />
扩展基本类型
我们常认为简单类型的定义较为简单,但是在XML Schema文档中却提供了更为灵活,更高级的约束。例如,要定义一个colorname元素,你可能想把它设置为一个简单的string类型:
<xsd:element name="colorname" type="xsd:string" />
但是,你也可以用XML Schema中的enumeration关键字为colorname元素列举所允许的颜色。在这些情况下,就必须对基本类型进行扩展。但是,在定义元素时你已经限定它为基本类型string,而不是扩展的基本类型,为此就需要使用restriction关键字:
<xsd:simpleType name="colorname">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="blue" />
<xsd:enumeration value="green" />
<xsd:enumeration value="red" />
</xsd:restriction>
</xsd:simpleType>
另外,当你使用基本类型并且扩展它时,可以使用extension关键字:
<xsd:element name="title">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="isbn" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
在这里title元素被定义为简单的string类型,但是添加了一个属性(isbn,也是一个string类型)。
注意:对于Java程序员而言,extension和restriction之间的区别并不是那么明显。我们已经习惯于扩展(即使子类最终给可授受的类型添加限制)。在XML Schema文档中,你可以使用restriction来进一步约束数据类型,并且可以使用extension来增强数据类型。