浏览 5268 次
锁定老帖子 主题:XML Schema设计轻松掌握
精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-06
XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,还是64位?这些细节对实现互操作性都是很重要的。W3C制定的XML Schema(XSD)和文档类型定义(Document Type Definition,DTD)格式就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。 2.XML Schema和DTD的区别 XML Schema的作用和DTD类似。但不同的是,Schema文件所描述的是引用它的XML文件中的元素和属性的具体类型。另外,由于它是由XML编写的,Schema和DTD相比较还有以下优点: 1)XML Schema内容模型是开放的,可以随意扩充,而DTD无法解析扩充的内容。 2)DTD只能把内容类型定义为一个字符串,而XML Schema允许把内容类型定义为整型、浮点型、布尔型或者许多其它的简单数据类型。 3)XML Schema利用Namespaces将文档中特殊的节点与Schema相联系,一个XML文件可以有多个对应的Schema,而一个XML文件只能有一个DTD。 3.Schema的基本概念 一个Schema文档由注释,声明,类型定义,模型组,属性组五部分组成.我们可以在Schema文档中定义简单类型和复杂类型,也可以声明元素(elment),添加属性(attribute),给出注释,定义模型组和属性组 3.1声明文档元素 元素是通过使用element元素来声明的. 比如说声明一个number元素,并指定他的类型为Schema内建的字符串(string)型.通过在类型名称前冠以命名空间前缀来使用,syntax: <xsd:element name="number" type="xsd:string"/> 3.2添加属性 属性则是通过使用attribute元素来声明的。它们只能是简单类型,只能包含文本,且没有子属性。可以应用在attribute元素定义中的属性如下: default 初始默认值 fixed 不能修改和覆盖的属性固定值 name 属性的名称 ref 对前一个属性定义的引用 type 该属性的XSD类型或者简单类型 use 如何使用属性 form 确定attributeFormDefault的本地值 id 模式文档中属性唯一的ID 3.3类型定义 在Schema中,类型(type)可以分为两种形式,一种是简单的类型,被称为simple,一种是复杂的类型,被称为complex。复杂类型和简单类型之间最根本的区别就是:复杂类型的内容中可以包含其他元素,也可以带有属性(Attribute),但简单类型既不能包含子元素,也不能带有任何属性。 当需要定义新的复合类型的时候,应当使用complexType元素来定义,这样的典型定义包括元素声明、元素引用和属性声明。 3.4定义模型组 分组定义中使用的是group元素。例如: <xsd:group name=”CityChoice”> <xsd:choice> <xsd:element name=” Beijing ” type=”xsd:string” /> <xsd:element name=” Shanghai ” type=”xsd:string” /> <xsd:element name=”Xian” type=”xsd:string” /> </xsd:choice> </xsd:group> <xsd:element name=”City”> <xsd”group ref=”CityChoice” minOccurs=”1” maxOccurs=”1” /> </xsd:element> 3.5定义属性组 对属性的分组,应该使用attributeGroup元素,例如: <xsd:attributeGroup name=”contactAttribs”> <xsd:attribute name=”city” type=”xsd:string” /> <xsd:attribute name=”country” type=”xsd:string” /> <xsd:attribute name=”age” type=”xsd:string” /> </xsd:attributeGroup> <xsd:element name=”contact”> <xsd:complexType> <xsd:attributeGroup ref=”contactAttribs” /> </xsd:complexType> </xsd:element> 4.深入了解复杂类型 4.1复杂类型的类型 复杂类型一般可以分为三类:第一类是包含字符内容和属性但不包含子元素;第二类是包含属性和子元素但不包含字符数据(字符数据包含在子元素中);第三类是即包含属性和字符内容又包含子元素的;那么如何来定义这三类类型呢?针对第一类可以通过simpleContent来实现,第二类可以通过complexContent来做到,第三类只需要将complexType的属性mixed设为true就可以了。 1)第一种类型(从一个简单类型扩展而来,增加了属性): <xsd:element name="internationalPrice"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="currency" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> 2)第二种类型(有一个element和两个attribute构成): <xsd:element name="internationalPrice"> <xsd:complexType> <xsd:complexContent> <xsd:element name=”Country” type=”xsd:string” /> <xsd:attribute name="currency" type="xsd:string"/> <xsd:attribute name="value" type="xsd:decimal"/> </xsd:complexContent> </xsd:complexType> </xsd:element> 3)第三种类型: <xsd:element name="letterBody"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="salutation"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="quantity" type="xsd:positiveInteger"/> <xsd:element name="productName" type="xsd:string"/> <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> 4.2利用组合器控制结构 1)sequence组合器 sequence组合器,定义了一列元素必须按照模式中指定的顺序显示(如果是可选的,也可以不显示)。语法如下: <xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”> <xsd:element name=”name”> <xsd:complexType> <xsd:sequence> <xsd:element name=”first” type=”xsd:string” /> <xsd:element name=”middle” type=”xsd:string” /> <xsd:element name=”last” type=”xsd:string” /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> 2)all组合器 all组合器,允许所定义的元素可以按照任意顺序显示,all元素的子元素在默认情况下是必须的,而且每次最多显示一次。语法如下: <xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”> <xsd:element name=”name”> <xsd:complexType> <xsd:all minOccurs=”0”> <xsd:element name=”first” type=”xsd:string” /> <xsd:element name=”middle” type=”xsd:string” /> <xsd:element name=”last” type=”xsd:string” /> </xsd:all> </xsd:complexType> </xsd:element> </xsd:schema> 3)choice组合器 choice组合器,允许指定多组声明中的一个,用于互斥情况。语法如下: <xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”> <xsd:element name=”name”> <xsd:complexType> <xsd:choice> <xsd:element name=”first” type=”xsd:string” /> <xsd:element name=”middle” type=”xsd:string” /> <xsd:element name=”last” type=”xsd:string” /> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> 4.3派生新类型 派生新类型有两种方式:第一种就是直接从其他类型中扩展(继承)而来,另外一种就是通过对已有类型进行限定性约束而来。如:以下有三种通过限定性约束定义的新类型: 1)通过值范围限定: <xsd:simpleType name="myInteger"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="10000"/> <xsd:maxInclusive value="99999"/> </xsd:restriction> </xsd:simpleType> 2)使用模式匹配限定: <xsd:simpleType name="SKU"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-[A-Z]{2}"/> </xsd:restriction> </xsd:simpleType> 3)使用枚举方式限定: <xsd:simpleType name="CNCity"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="BeiJing"/> <xsd:enumeration value="NanChang"/> <xsd:enumeration value="ShangHai"/> </xsd:restriction> </xsd:simpleType> 5.工具 XML Schema的语法并不简单。虽然可以用简单的文本编辑器手工创建schema,但是复杂的应用,这样做也许会很难。为了更好地利用它,你可以采用若干种XML工具,最近出现的一些工具甚至提供了创建XML Schema的图形界面。XML Spy和Cape Clear Studio都是具有XML Schema创建功能的全方位XML综合开发环境。dtd2xs是一种DTD-to-XML的Schema转换工具,它有两种形式:单独运行的应用程序和Java类。同DTD一样,标准的XML Schema定义非常多,你可以根据自己的需要在应用程序的开发中采用。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |