第3章 XML Schema.ppt_第1页
第3章 XML Schema.ppt_第2页
第3章 XML Schema.ppt_第3页
第3章 XML Schema.ppt_第4页
第3章 XML Schema.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第3章 XML Schema,3.1 XML模式Schema,3.1 Schema与DTD的区别和优势 DTD不使用XML语法,而XML Schema使用XML语法。也就是说,可以使用分析、编辑和处理XML的工具(包括DOM、SAX等APIs)对XML Schema进行处理。 DTD作为XML1.0的一部分,对名字空间(名字空间晚于XML1.0发布)不能提供很好的支持。在DTD中只能把名字空间作为元素前缀声明,然后在XML文档中进行URI绑定;XML Schema提供对名字空间很好的支持,可在XML Schema直接对名字空间进行URI绑定。 DTD对数据类型只提供了粗略描述,如PCDATA、

2、NMTOKEN等等,而XML Schema提供了诸如string、int、token、date、byte、language等等内建数据类型,还提供用数据类型的派生(derivation)、继承和户自定义数据类型,不仅如此,XML Schema还可以对可选数据范围很方便得进行限制。同时,XML Schema可以对文档结构进行比DTD精确的定义,如子元素出现的次数。,3.2局部和全局定义,DTD中的所有声明都是全局声明,而XML模式则既有全局声明也有局部声明,可以视情况而定。 在DTD中,每个元素都被声明为全局的,所以每个元素必须有一个唯一的名字并且只能声明一次。元素可被多个其他元素所引用,但在这

3、些情况下,它们的定义必须完全相同。 然而在XML模式中,上下文是非常重要的。在模式的顶层声明的元素被认为是全局声明。在定义一个复杂类型时,可以参考和使用这些全局定义的元素作为该类型的一个子部分,也可以同时定义一些新的局部元素,但作用域被限制在该复杂类型之内。 值得注意的是,XML Schema虽然具有以上特点,但在实际应用中并不能完全代替DTD。,3.3 Schema的基本结构和使用, This is my very first schema. It does not have any elements yet, but it will. ,3.4 设计思路,Schema在设计思路上与DTD不

4、同: DTD直观而简单得描述XML文档,而Schema基本思路是从通过描述元素/属性的类型(type)及该类型中的内容(content)来“复杂”而准确地描述XML文档。 简单类型(simpleType) 复杂类型(complexType) 有名/无名类型 全局/局部声明,Schema内建了丰富的数据类型,被称为“简单类型(simpleType)”,可以直接在元素和属性中使用它们,如上例中的xs:string,也可以用它们派生出其它“简单类型”和“复杂类型(complexType)”。 值得注意的是XML Schema虽然提供内建ENEITY数据类型,却没有提供声明ENTITY的机制,如果要使

5、用ENTITY,必须在DTD中声明(XML文档在一定程度上可以同时使用XML Schema和DTD)。 Schema内建的简单类型图,Schema内建数据类型,数据类型,元素的声明 xsd:element元素的可选属性很多,如上面的name(name属性也是可选的,因为还有其它的声明方式,如ref,见“元素和属性的引用”),还有type、maxOccurs、minOccurs、default、fixed等等,将在后面介绍。,1. 元素的类型,1. 元素的类型,1. 元素的类型,1. 元素的类型,1. 元素的类型 仅仅声明元素的名字是不够的,还必须说明元素的类型(type): (1)直接声明。声

6、明语法: 其中“元素的类型”可以是内建的数据类型(如xsd:string),也可以是自定义的数据类型。就是一个元素名字和类型的直接声明: 声明了一个名字为的street元素,它的类型为xsd:string,即它的内容为Scheam内建数据类型string。,(2)元素内声明。声明语法: xs:element name=”元素的名字” 其中xs:complexType可用来声明子元素或属性 如: ,2. 子元素的声明 在XML Schema中,一个元素包含了子元素(或属性),则说该元素具有复杂类型(complex type)。也就是说,元素和它的子元素(或属性)是通过复杂类型构建的。 如: ,或

7、 其中xs:sequence控制子元素在XML文档中出现的顺序:xs:sequence包含的元素必须都出现而且必须按照声明的顺序。 相关的顺序控制符还有xs:choice和xs:all。 xs:choice表示它包含的多个元素中有且只有一个元素出现在相应的XML文档中。 xs:all表示它包含的多个元素必须都出现但可以按任何顺序。,3. 混合内容(mixed content) 通过在xs:complexType元素中设置mixed属性为true,XML Schema允许混合内容的XML实例文档,如下: Dear Mr.John Smith. Your order 1032 will be sh

8、ipped on 2001-07-13. ,XML Schema: 在混合内容中,依然可以用xs:sequence、xs:choice和xs:all来控制元素在实例文档中的出现情况。,4. 元素的默认值 元素的默认值可以按照如下方式声明: 如: 默认值表示该元素值如果在XML文档没有出现,则解析器以该默认值代替;如果出现,则按出现的值处理。,5. 元素的固定值 元素的固定值可以按照如下方式声明: 如: 固定值表示该元素值如果在XML文档没有出现,则解析器以该固定值代替;如果出现,则必须是该固定值。,6. 元素的出现次数 XML Schema可以控制元素出现的次数,如下: 如: minOccur

9、s和maxOccurs的默认值都是“1”,minOccurs为非负且要求小于或等于maxOccurs,maxOccurs的值可为“unbounded”(不限)。,6.5.3 属性的声明 在XML Schema中,一个元素包含了属性(或子元素),则说该元素具有复杂类型(complex type)。也就是说,元素和它的属性(或子元素)是通过复杂类型构建的。如: 实例文档片段: Sichuan,声明属性时也必须声明属性的类型,属性本身只能是简单的类型(不能包含属性或元素的类型),如XML Schema内建的数据类型,因为属性不能包含属性或子元素。 xs:attribute元素有很多可选属性,如def

10、ault、fixed和use,其中default和fixed属性用法和xs:element中的default和fixed属性用法相同;use属性用来控制属性的使用情况,它的三个可选值如下: use = ( optional | prohibited | required ) use的默认值是optional(选用即可在实例文档中出现或不出现),其它两个值分别为prohibited(禁用)和required(必用)。,空(Empty)元素的声明 前面使用了xs:simpleContent说明元素province的复杂类型有简单内容,所以在实例文档元素province的内容可为Sichuan(也可

11、为空Empty)。如果需要元素province只能为空值,可用如下方式定义该空元素: ,如果有必要声明没有属性的空元素(通常这没有实际意义),可按如下方式声明: 必须指出,空(Empty)元素和nill 元素不同(nill 元素不是表示元素为空值,而是表示元素可以没有值或不知道该值,类似于SQL的null),这里不讨论nill 元素,可参考相关书籍。,类型的派生 声明新的简单类型 取值说明 复杂类型的派生 restriction extension,1. 声明新的简单类型 如下Schema片段: 使用xs:simpleType和xs:restriction可以为元素或属性定制新的简单类型,本例

12、中新的类型streetType和Schema内建string类型相映射。这样定义看来多余,但我们实际上常常在自定义类型中加上“取值限制”,就非常有用了。,除了list和union,取值说明符的语法为: ,例如: 这里定义了一个简单类型,其内容只能是由大写字母A-Z中任六个字母组成的字符串。 实例文档片段: HABGYH,list的语法: 列举是用空格分开的一系列原子类型值。 例如: ,或: 实例文档片段: HABGYH ABSDFJ DFGLKJ,union的语法。 联合是从列举的类型(用空白字符分开)中任选一种而且只能选一种。 例如: 实例文档片段: HABGYH ABSDFJ 或者 124

13、56 各取值说明符详细的用法可参考相关书籍。,复杂类型的派生 我们可以通过xs:extension和xs:restriction元素来从已有的类型派生出新的复杂类型,原理上类似面对对象编程中的继承。 (1)restriction派生。 当新派生的类型逻辑上是现有类型的一个子集是,可使用restriction派生,如下: 现有类型: ,restriction派生: 这里新派生的类型比原有的类型少了maxOccurs=3这个限制。,(2) extension派生 extension派生相当于在已有的类型的内容后面加上在xs:extension中声明的内容。 现有类型: ,extension派生:

14、,其结果相当于定义如下类型: ,全局声明和有名类型声明方式的Schema 先来看一个发货单的实例文档: John Smith Ola Nordmann Langgt 23 4000 Stavanger Norway Empire Burlesque 1 10.90 Hide your heart 1 9.90 , ,全局(global)声明方式的Schema 全局声明方式把元素或属性作为xs:schema的直接子元素声明叫作全局声明。反之,把元素或属性放在其他元素内声明,叫作局部声明。上面的Schema使用的是局部声明方式。下面的Schema使用全局声明和对已声明元素或属性的引用(refere

15、nce)来实现。, , , ,有名类型(named type)声明方式的Schema 前面所有复杂的和简单的类型都是匿名类型或直接使用的内建类型,用户没有给每个类型一个用户取的名字,这不便于类型的控制,下面的Schema使用有名类型声明方式来实现。, , , ,注释 Schema是XML文档,自然可以用XML注释,即来进行注释,但解析器不保证这种注释在通过解析后不变,这会导致重要信息的损失设想当你用XML注释保存版权信息时,你希望该信息能保持不变甚至可以被象XML元素一样处理,这时,可以使用xs:annotation。 在xs:annotation中,可选择使用xs:documentation

16、或xs:appinfo或二者都用。其中,xs:documentation是方便人阅读的,xs:appinfo是方便应用程序处理的。二者的内容都可以是字符内容或者任何“结构良好的”标记内容。,使用多个Schema DTD中使用参数实体来使用多个DTDs,XML Schema也提供相应机制,而且更强大。可以在一个Schema中包括(include)同名字空间的外部声明,重定义(redefine)同名字空间的外部声明,还可以输入 (import)属于别的名字空间的Schema。 “包括外部声明”的语法为: “重定义外部声明” 的语法为: “输入属于别的名字空间的Schema” 的语法为: ,名字空间

17、和XML Schema 使用全局声明的一个好处是把名字空间和全局声明的元素、属性、属性组、类型等相联系。我们知道,XML Schema对名字空间有很好的支持,把一个Schema和一个名字空间联系起来是通过xs:schema 的targetNamespace(目标名字空间)属性实现。, 注意,使用targetNamespace后,Schema中所有全局声明就属于该名字空间。,实例文档中使用名字空间 XML Schema要求在实例文档根元素中分别使用xsi:noNamespaceSchemaLocation或xsi:schemaLocation属性来定位处理不使用或使用目标名字空间的Schema。

18、 同时,要求在实例文档对该目标名字空间进行绑定:可以通过默认名字空间或前缀进行URI绑定。, 108 Street Chengdu Sichuan 或 108 Street Chengdu Sichuan,由于使用targetNamespace后,Schema中所有全局声明就属于该名字空间。下面例子将导致错误: ,这里,addressType是全局声明所以属于targetNamespace,必须在使用该类型时注明名字空间。所以可将上例改为: ,xs:schema还有两个常有属性:elementFormDefault attributeFormDefault 分别用来控制局部声明的元素和属性是否受目标名字空间限制。 elementFormD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论