XML之XML Schema

前端之家收集整理的这篇文章主要介绍了XML之XML Schema前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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规范构建中。然后,attributeFormDefaultelementFormDefault的值都设置为“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关键字对typewidth属性进行定义和注解。

简单类型

如果是所谓的“简单类型”,你完全可以不使用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来增强数据类型

猜你在找的XML相关文章