XML之XML Schema

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规范构建中。然后,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: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关键字对typewidth属性进行定义和注解。

简单类型

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

转载于:https://my.oschina.net/fhd/blog/367269

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值