83
1 第 11 第 XML 第第

第 11 章 XML 技术

Embed Size (px)

DESCRIPTION

第 11 章 XML 技术. 第 11 章 XML 技术. 11.1 XML 的由来 11.2 XML 的语法成分 11.3 文档类型定义 11.4 XML 模式 11.5 XML 查询和转换 11.6 XML 数据的存储 11.7 小结. 前 言. 本章介绍 XML 技术, XML ( eXtensible Marrkup Language ,可扩展标记语言)是一种能够表述比其他数据模型中的数据结构化程度低的数据的语言。 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 11 章  XML 技术

1

第 11 章 XML 技术

Page 2: 第 11 章  XML 技术

2

第 11 章 XML 技术11.1 XML 的由来11.2 XML 的语法成分11.3 文档类型定义11.4 XML 模式11.5 XML 查询和转换 11.6 XML 数据的存储11.7 小结

Page 3: 第 11 章  XML 技术

3

前 言 本章介绍 XML 技术, XML( eXtensible Marrkup

Language ,可扩展标记语言)是一种能够表述比其他数据模型中的数据结构化程度低的数据的语言。

XML 语言开始是设计为一种用来给文本文档增加额外信息的途径,但随着在数据交换中的应用它已经变得重要起来。 XML 提供了一条途径来表示有嵌套结构的数据,但在数据的结构化方面允许有非常大的灵活性。

本章先介绍 XML 的形成过程,然后分别介绍 XML文档的语法成分、文档类型定义( DTD )、 XML模式、查询和转换、数据存储等内容。

Page 4: 第 11 章  XML 技术

4

11.1 XML 的由来

11.1.1 从 SGML、 HTML到XML

11.1.2 XML和 HTML 的区别11.1.3 XML 在数据交换中的作用

Page 5: 第 11 章  XML 技术

5

11.1.1 从 SGML、 HTML到XML(1)

图 11.1 XML 的来历

GML( 1969 )

XHTML

SGML( 1986 )

HTML( 1989 )

XML( 1998 )

通用标记语言

标准通用标记语言

超文本标记语言

可扩展标记语言 扩充超文本 标记语言

Page 6: 第 11 章  XML 技术

6

1. GML和 SGML在 20 世纪 60 年代末,随着出版业和文字处理技术的进步,产生了描述文档格式的标记语言,但未通用化和标准化,这在很大程度上影响了文档的交换和共享,而通用化又是标准化的前提。

定义 11.1 标记( Markup )是指文档中任何不想用于打印输出的部分。标记语言(Markup Language )是对文档的哪部分是内容、哪部分是标记以及对这些标记的含义进行形式化描述的一种语言。

11.1.1 从 SGML、 HTML到XML(2)

Page 7: 第 11 章  XML 技术

7

为此, IBM 公司在 1969 年成立了一个小组,着手开发通用标记语言( Generalized Markup Language ,简记为 GML )。经过近十年的研究和发展,通用化技术已经成熟并且得到承认。 1978 年, ISO 着手制订 SGML( Standard GML )国际标准,于 1986 年公布了 SGML 标准。当时 SGML 主要用于大型、复杂文档(例如大型客机、电力厂的维护文档)的保存、交流和管理,应用比较局限。

SGML 不仅仅是一种标记语言,还可以认为是一种元语言。利用它可以定义各式各样的标记语言。它允许开发者根据需要制定相关的文档类型定义。但是这种灵活性带来的缺点是 SGML 过于复杂和庞大,需要复杂的软件去处理它。

11.1.1 从 SGML、 HTML到XML(3)

Page 8: 第 11 章  XML 技术

8

2.HTML1989 年,欧洲粒子物理研究中心的 Tim Berners-Lee 使用类 SGML 语法,开发了HTML( HyperText Markup Language ,超文本标记语言)。尽管 HTML 语言是 SGML的一个很小的子集,却是一个重要应用的开端。HTML 针对 SGML 过于复杂的问题,指定很小的一组结构和语义标记,使其适合相对简单的文档的书写,另外还增加了对超文本的支持。

11.1.1 从 SGML、 HTML到XML(4)

Page 9: 第 11 章  XML 技术

9

3. XMLHTML 毕竟过于简单,不足以描述万维网( WWW )上的多样化数据,更不能支持复杂的数据交换与处理。如此发展下去, HTML 标准有失控的危险。为此万维网组织W3C从两个方面着手解决这个问题:一是扩充 HTML ,称为 XHTML;二是开发 XML ,取代 HTML 。两者都吸收了 SGML 中有用的成分,不过深浅有异。前者是改良,后者是变革。从长远观点看,两者将统一于 XML 。

XML是 SGML 的一个子集,它试图将HTML 的简单性与 SGML 的强大功能结合起来。 XML原来的设计目的是为了给 Web 文档提供功能标记,但如今已成为应用程序间数据交换的事实上的标准化数据格式。

11.1.1 从 SGML、 HTML到XML(5)

Page 10: 第 11 章  XML 技术

10

这里先举一个例子,再来分析 XML和HTML 的区别。

例 11.1 设有关于课程和教材的记录:

课程号: CS106课程名:数据库系统教材名:数据库系统教程作者:施伯乐等出版:高等教育出版社

11.1.2 XML和 HTML 的区别 (1)

Page 11: 第 11 章  XML 技术

11

若用 HTML ,可以这样表示:

<html><p>课程号: CS106<br>课程名:数据库系统<br>教材名:数据库系统教程<br> 作者:施伯乐等<br> 出版:高等教育出版社<br>

</html>

11.1.2 XML和 HTML 的区别 (2)

Page 12: 第 11 章  XML 技术

12

若用 XML ,可以这样表示:

<course>

<course_no>课程号 :CS106</course_no>

<course_name>课程名 : 数据库系统 </course_name>

<text_name>教材名 : 数据库系统教程 </text_name>

<author_name> 作者 :施伯乐等 </author_name>

<publisher> 出版 :高等教育出版社 </publisher>

</course>

11.1.2 XML和 HTML 的区别 (3)

Page 13: 第 11 章  XML 技术

13

用 HTML 表示,只能表示文档的格式,而不能表示文档的内涵。

用 XML 表示,却可以表示文档的结构和内涵。实际上, XML 已从过去的文档标记语言发展成为文

档描述语言。在 HTML 中,文档展示格式(例如分段、字体等)或由 HTML规定,或按浏览器的默认规定执行。

在 XML 中,展示格式与 XML 文档本身分开,用一个独立的格式单( Stylesheet )定义。用一个 XML文档,对不同的用户,可以采用不同的格式单。

XML 能够通用化,就是靠上述两个措施:一是可自由扩充的标记,二是独立于文档的格式单。

11.1.2 XML和 HTML 的区别 (4)

Page 14: 第 11 章  XML 技术

14

1996年W3C正式成立 XML工作组。 1998年 2月,XML1.0被W3C确认为推荐标准。长期以来,文档管理属于信息检索范畴,似乎与数据管理分开的。例如Lotus Notes 系统也有文档数据库,但不是用通用的DBS实现的。实际上,文档(包括多媒体文档)属于半结构化数据。半结构化数据也称为无模式数据或自描述数据。描述数据的数据称为元数据,描述数据的语言称为元语言,XML 是描述文档的元语言。经元语言描述的文档也称为数据模式( Schema ),但与传统的数据模式的概念有区别。

11.1.2 XML和 HTML 的区别 (5)

Page 15: 第 11 章  XML 技术

15

半结构化数据和对它的描述是混在一起的。它与传统的数据库不同,不是按事先定义的模式插入数据,而是先有了数据(即文档),再描述数据,经 XML 描述 的 文 档 , 不 但 便 于 交 换 , 可 以 取 代EDI( Electronic Data Interchange ,);而且还可以变换和查询,可以由传统的 DBMS 管理。目前 DB2、 ORACLE 9i、 SQL Server 2000 等都增加了支持 XML 的功能。 DBS 不但可以用 XML 文档的形式向WWW 提供其中的数据,而且还可以直接管理 XML 文档。 XML 技术使得文档管理与数据管理逐步融合,而 DBS 成为 WWW 中的数据服务中心。

11.1.2 XML和 HTML 的区别 (6)

Page 16: 第 11 章  XML 技术

16

在所有标记语言中,标记采取的形式是封闭在尖括号( <> )中的标签( Tag )。标签都成对使用,以 <tag>和 </tag> 来界定该标签所指的文档中的某个部分的开始和结束。这在例11.1 中已用到了。和 HTML 不同, XML 中不指定允许的标签集,可以根据需要对标签集进行特殊化。这项特性决定了 XML 在数据表示和数据交换中地位的重要性,而 HTML 主要应用于文档格式化。

11.1.3 XML 在数据交换中的作用 (1)

Page 17: 第 11 章  XML 技术

17

与数据库中的数据存储相比, XML 的表达可能效率不高,因为标签名称在整个文档中被反复使用。尽管如此, XML 的表达在用于数据交换时,还是有相当大的优势,具体体现在下面三点:( 1 )标签使得消息是自描述的,即不需要某个模式来理解文本的含义。( 2 )文档的格式不很严格。( 3) XML 格式已被广泛接受,有各式各样的可用工具来辅助对它的处理,包括浏览器软件和一些数据库工具。现在, SQL 是关系数据库的主导查询语言,而XML正在成为数据交换的主导格式。

11.1.3 XML 在数据交换中的作用 (2)

Page 18: 第 11 章  XML 技术

18

11.2 XML 的语法成分11.2.1 XML声明11.2.2 元素11.2.3 属性11.2.4 引用11.2.5 注释11.2.6 名字空间 定义 11.2 一个 XML 文档由序言和文档实例两

个部分组成。序言包括一个 XML声明和一个文档类型声明,二者都是可选的。序言之后是文档实例,它是文档的主体。

Page 19: 第 11 章  XML 技术

19

XML声明是对 XML 文档处理的环境和要求的说明,不涉及文档本身的内容。

例 11.2 下面是一个声明的例子:<?xml version=〞 1.0〞 encoding=〞 UTF-8〞

standalone=〞 yes〞 ?>XML声明括在“ <?” 和“ ?>”之间,这个声明有三个

部分。第一部分说明文档所用的 XML 版本,是 1.0 版本。第 2 部分表示文档所用的密码,即 UTF-8 ,这是ISO 制定的一种通用字符编码,每个字符可用 8~ 48位编码。第三部分表示是否引用其他文档的内容, yes表示不引用其他文档的内容,即文档是独立的。

XML 标准规定, XML 文档必须冠以 XML声明,但内容不限,起码要有 XML 的版本声明。

11.2.1 XML声明 (XML Declaration)

Page 20: 第 11 章  XML 技术

20

定义 11.3 XML 文档中基本的结构是元素,一个元素是简单的一对互相匹配的开始和结束标签,以及出现它们之间所有的文本。

元素的结构如下:< 元素名 > 元素内容 </ 元素名 >

其中 < 元素名 > 为开标签, </ 元素名 > 为闭标签,两者之间为元素的内容。元素可以嵌套,嵌套的层数不受限制。最外层的元素只有一个,称为根元素。

XML 文档中的元素必须正确地嵌套,譬如:< 元素 1>…< 元素 2>…</ 元素 2>…</ 元素 1>

而下面是一个不正确的嵌套。 < 元素 1>…< 元素 2>…</ 元素 1>…</ 元素 2>

11.2.2 元素( Element) (1)

Page 21: 第 11 章  XML 技术

21

例 11.3 下面是学生与课程 联系信息的表示:

<university> <student> <s_no>S246</s_no> <s_name>LIU</s_name> <s_age>22</s_age> <s_sex>男 </s_sex> </student> <student> <s_no>S369</s_no> <s_name>WEN</s_name> <s_age>21</s_age> <s_sex>女 </s_sex> </student>

11.2.2 元素( Element) (2)

<course>

<c_no>C206</c_no>

<c_name>DBS</c_name>

</course>

<course>

<c_no>C204</c_no>

<c_name>OS</c_name>

</course>

Page 22: 第 11 章  XML 技术

22

11.2.2 元素( Element) (3)

<sc>

<s_no>S246</s_no>

<c_no>C206</c_no>

<score>85</score>

</sc>

<sc>

<s_no>S369</s_no>

<c_no>C204</c_no>

<score>100</score>

</sc>

</university>

Page 23: 第 11 章  XML 技术

23

例 11.4下面是 course 元素嵌套在 student 元素中:<university_1> <student> <s_no>S246</s_no> <s_name>LIU</s_name> <s_age>22</s_age> <s_sex>男 </s_sex> <course> <c_no>C206</c_no> <c_name>DBS</c_name> <score>85</score> </course> </student>

11.2.2 元素( Element) (4) <student> <s_no>S369</s_no> <s_name>WEN</s_name> <s_age>21</s_age> <s_sex>女 </s_sex> <course> <c_no>C204</c_no> <c_name>OS</c_name> <score>100</score> </course> </student></university_1>

Page 24: 第 11 章  XML 技术

24

在 XML 中,对元素还可以指定属性。属性包括属性名及属性值。属性名是个标记,属性值用引号括起。属性名与属性值以等号相连。属性一律放在开标签中。

例 11.5 在例 11.3 中, s_no和 s_name 可改用属性表示,则元素 student 可用下列形式表示:

<student s_no=〞 S246 〞s_name=〞 LIU〞 >

<s_age>22</s_age><s_sex>男 </s_sex>

</student>应注意,在文档构造上下文中,属性是隐式地不出现

在文档的打印或显示文档中的文本。但是在 DB和XML 的数据交换应用程序中,这种区别不很明显,并且可随意选择将数据表示为属性还是子元素。

11.2.3 属性( Attribute) (1)

Page 25: 第 11 章  XML 技术

25

但在 XML 中并不是在所有情况下都可以用属性代替子元素,它们之间至少有两点差别:① 在同一元素中,其属性不能重名,但它的子元素可以重名;②属性在书写时虽然有先后,但其次序是无关紧要的,而子元素按书写次序排序。

一般来讲,凡是元素的组成部分宜用子元素表示,凡表示元素性质的内容宜用属性表示;简短的内容宜用属性表示,嵌套或较长内容宜用子元素表示。

定义 11.6 没有内容只有属性的元素称为空元素( Empty Element )。

例如 <s_name=〞WEN〞 > </s_name>就是一个空元素,该空元素也可简写为

<s_name=〞WEN〞 /> 。

11.2.3 属性( Attribute) (2)

Page 26: 第 11 章  XML 技术

26

在编写 XML 文档时,常常要重用本文档或其他文档的内容。可将拟重用的内容定义为 Entity ,其格式如下:

<! Entity 引用名 〞引用元素〞 ><! …>是 XML 的定义语句格式, <! Entity …> 是一条定义

Entity 的语句。引用名是引用内容的名字,在引用时,只须在引用处填上“&引用名;”即可。引用内容可以是任意内容,例如可以是 HTML 文档、图形、声音、影视等。这些内容中可能包含 XML 中有特定含义的符号,引用内容可包装成如下形式:

<! [ CDATA [ 引用内容 ] ] > 开标签 闭标签引用内容经处理后, Entity 定义可表示为:

<! Entity 引用名 〞 <! [ CDATA [ 引用内容 ] ] >〞 >

11.2.4 引用( References )

Page 27: 第 11 章  XML 技术

27

XML 文档在需要时可随处加上注释。注释的格式如下:

<! --注释 -->注释仅供人阅读,机器在处理 XML 文档时予以忽略。注释可以是任意内容,但其中不得含有“ --” 字符串。

11.2.5 注释( Comments )

Page 28: 第 11 章  XML 技术

28

引入了“名字空间”机制以允许一些组织机构指定全局惟一的名字(譬如网址)作为文档中的元素标签使用。

举例来说,如果复旦大学想确保它创建的 XML 文档中的标签不全与其他业务伙伴的 XML 文档中的标签重复,它可以预先考虑每个标签名称上带有一个冒号的惟一标识符。复旦大学可以使用一个 Web URL ,例如:

http://www.fudan.edu.cn作为一个惟一标识符。每个标签中使用这样的长惟一标识符是很不方便的,所以名字空间标准提供了一种定义标识符缩写的方法。

11.2.6 名字空间 (Name Space)(1)

Page 29: 第 11 章  XML 技术

29

例 11.7 下面的代码通过使用名字空间获得惟一标签名:<university xmlns:FD=〞 http://www.fudan.edu.cn〞 > …… <FD:department> <FD:dept_name>Finance Department</FD:dept_name> <FD:dept_manager>Guo Ning</FD:dept_manager> </FD:department> ……</university>定义 11.5 符合下列条件的 XML 文档称为合式( Well Formed) XML 文档:

① 开头有 XML声明;② 有且仅有一个根元素;③ 开标签与闭标签正确地匹配。

11.2.6 名字空间 (Name Space)(2)

Page 30: 第 11 章  XML 技术

30

11.3 文档类型定义

11.3.1 元素类型空间11.3.2 属性声明11.3.3 DTD 的局限性

定义 11.6 文档类型定义( Document Type Definition, DTD )是对 XML 文档的结构和约束的定义。

Page 31: 第 11 章  XML 技术

31

例 11.7 下面是学生与课程信息文档的 DTD 示例中的一部分。<! DOCTYPE university_1 [

<! ELEMENT university ((student|course|sc) *)><! ELEMENT student (s_no,s_name,s_age,s_sex)><! ELEMENT course (c_no,c_name)><! ELEMENT sc(s_no,c_no,score)><! ELEMENT s_no(#PCDATA)><! ELEMENT s_name(#PCDATA)><! ELEMENT s_age(#PCDATA)><! ELEMENT s_sex(#PCDATA)><! ELEMENT c_no(#PCDATA)><! ELEMENT c_name(#PCDATA)><! ELEMENT score(#PCDATA)>

] >

11.3.1 元素类型声明 (1)

Page 32: 第 11 章  XML 技术

32

这里,一个 university 元素包含一个或多个 student、course或 sc 元素。操作符有 “ *” 、“ |” 、“ +” 、“?”。

student 元素定义为包含子元素s_no、 s_name、 s_age和 s_sex (按顺序)。同样,course和 sc 在模式中将它们的属性定义为子元素。随后,这些子元素都被声明为类型 #PCDATA 。关键字#PCDATA 表示文本数据。

元素还可以有另外两种特殊类型声明: EMPTY和ANY。 EMPTY 表示这个元素没有内容,通常用属性来表示某些参数。 ANY 是说对这个元素的子元素没有任何的限制,可以出现任何内容,甚至在 DTD中未提及的元素,也可以作为该元素的子元素出现。一个元素缺少声明就等同于将这个元素显式地声明为类型 ANY 。

11.3.1 元素类型声明 (2)

Page 33: 第 11 章  XML 技术

33

每个元素中的属性也在 DTD 中声明。与子元素不同,属性没有顺序之分。属性声明以“ <! ATTLIST” 开始,以“ >” 结束,中间是元素名称和属性定义。其定义的属性名称、属性类型和默认值三部分组成。属性必须有一个类型声明和一个默认声明。类型声明是对属性指定为下面五种类型之一:·PCDATA或 CDATA:不含有 XML 中有特定意义的字符串,或者免除语法分析的字符串。·ID:该属性提供为元素的惟一的标识符。·IDREF或 IDREFS:属性值是其他元素或本元素的ID 。此属性值可能是多值,值间用空格分开。·ENTITY或 ENTITIES:属性值是引用名,可能是多值,值间以空格分开。·枚举类型:在列举的值中取其一。

11.3.2 属性声明 (1)

Page 34: 第 11 章  XML 技术

34

默认声明可以包含该属性的一个默认值,也可以指定为下面三种类型之一:

·#IMPLIED:表示该属性是可选的,既可以要,也可以不要。

·#REQUIRED:表示该属性是必需的,若缺少属性值,则取默认值,但默认值无须在定义中标明。

·#FIXED:表示该属性是必需的,若缺少属性值,则取其默认值,但默认值必须在定义中标明。

例 11.9 对于例 11.4 中文档的嵌套表示方法,现在采用引用方式,并在 student 元素中可引用 course 元素,在 course 元素中可引用 student 元素,具有 ID和IDREF属性类型的 DTD 如下表示:

11.3.2 属性声明 (2)

Page 35: 第 11 章  XML 技术

35

<! DOCTYPE university_2 [<! ELEMENT student (s_name,s_age,s_sex,s_courses)><! ELEMENT s_courses (s_c*)><! ELEMENT s_c (score)><! ELEMENT course (c_name,c_students)><! ELEMENT c_students (c_s*)><! ELEMENT c_s (score)><! ATTLIST student s_no ID #REQUIRED><! ATTLIST s_c c_id IDREF #REQUIRED><! ATTLIST course c_no ID #REQUIRED><! ATTLIST c_s s_id IDREF #REQUIRED><! ELEMENT s_name(#PCDATA)><! ELEMENT s_age(#PCDATA)><! ELEMENT s_sex(#PCDATA)><! ELEMENT c_name(#PCDATA)>

] >

11.3.2 属性声明 (3)

Page 36: 第 11 章  XML 技术

36

下面是基于上述 DTD的 XML 文档例子:<university_2>

<student s_no=〞 S246〞 ><s_name>LIU</s_name><s_age>22</s_age><s_sex>男 </s_sex><s_courses><s_c>

<c_id>C206</c_id><score>85</score>

</s_c></s_courses>

</student>

11.3.2 属性声明 (4)

Page 37: 第 11 章  XML 技术

37

<student s_no=〞 S369〞 ><s_name>WEN</s_name><s_age>21</s_age><s_sex>女 </s_sex><s_courses>

<s_c><c_id>C204</c_id><score>100</score>

</s_c></s_courses>

</student>

11.3.2 属性声明 (5)

Page 38: 第 11 章  XML 技术

38

<course c_no=〞 C206〞 ><c_name>DBS</c_name><c_students>

<c_s><s_id>S246</s_id><score>85</score>

</c_s></c_students>

</course><course c_no=〞 C204〞 >

<c_name>OS</c_name><s_students>

<c_s><s_id>S369</s_id><score>100</score>

</c_s></c_students>

</course></university_2>

11.3.2 属性声明 (6)

Page 39: 第 11 章  XML 技术

39

DTD与 XML 的文档格式化继承有很强的联系。由于这个原因,将 DTD 作为数据处理应用中的 XML类型结构来使用在很多方面是不合适的。尽管如此,大量的数据交换格式是以 DTD 来定义的,这是因为它们是最初标准的一部分。

以 DTD 作为模式的局限性有以下三点:( 1 )个别的元素和属性不能更进一步归类。( 2 )很难用 DTD 机制来指定子元素的无序集合。( 3 )对于 IDREF或 IDREFS 的属性未指明引用哪

一个元素类型的机制。这样,在例 11.8 中就有可能 student 元素中引用到student 元素,这就无意义了。

11.3.3 DTD 的局限性

Page 40: 第 11 章  XML 技术

40

11.4 XML 模式

11.4.1 XML 模式的示例11.4.2 XML 模式的基本成分11.4.3 XML 模式的优点

Page 41: 第 11 章  XML 技术

41

XML中 DTD明显地刻着 SGML 的烙印。关键是, DTD 本身并不是 XML ,而且它只提供了非常有限的数据类型,也不支持名字空间,另外 DTD 中的内容模型是不开放的,不能随意扩充内容。为此, W3C 组织推荐了一个 XML 模式标准,以弥补DTD 的不足,作为检查 XML 文档正确性的依据。

XML 模式与传统的数据模式有区别。 XML 模式是从 XML 文档中抽象出来的,先有 XML 文档,后有XML 模式,它主要用于正确性检查。

在 XML 模式中先说明文档中所用的名字空间,然后用 XML 文档的语法定义元素、主键和外键。下面先举例,然后详细地解释。

11.4.1 XML 模式的示例 (1)

Page 42: 第 11 章  XML 技术

42

例 11.9 下面是来自例 11.8 中的 DTD的 XML 模式:<? xml version=〞 1.0〞 encoding=〞 UTF-8〞 ?><schema xmlns:xsd=〞 http://www.w3.org/2001/XML Schema〞 xmlns:xsd=〞 http://www.fudan.edu.cn/university〞 ><! -- 定义匿名类型元素 university--><element name=〞 university〞 type=〞 universityType〞 /> <complexType> <sequence>

<element name=〞 student 〞 type=〞 rgt:studentType〞minOccurs=〞 0 〞 maxOccurs=〞 unbounded〞 />

<element name=〞 course 〞 type=〞 rgt:courseType〞minOccurs=〞 0 〞 maxOccurs=〞 unbounded〞 />

</sequence> </complexType>

11.4.1 XML 模式的示例 (2)

Page 43: 第 11 章  XML 技术

43

<! -- 定义类型 studentType--> <complexType name=〞 studentType〞 > <sequence> <element name=〞 s_name 〞 type=〞 rgt:string〞 /> <element name=〞 s_age 〞 type=〞 rgt:integer〞 />

<element name=〞 s_sex 〞 type=〞 rgt:setType〞 /> <element name=〞 s_courses 〞 type=〞 rgt:courseNoType〞

minOccurs=〞 0 〞 maxOccurs=〞 12〞 /> </sequence> <attribute name=〞 s_no 〞 type=〞 rgt:studentNoType〞 /> <! -- 定义主键 --> <key name=〞 studentKey〞 > <selector XPath=〞 student〞 /> <field XPath=〞@s_no〞 /> </key> <! -- 定义外键 --> <keyref name=〞 courseRef 〞 refer=〞 courseKey〞 >

<selector XPath=〞 student/s_courses〞 /><field XPath=〞 text(s_courses)〞 />

</keyref> </complexType>

11.4.1 XML 模式的示例 (3)

Page 44: 第 11 章  XML 技术

44

<! -- 定义类型 courseType--> <complexType name=〞 courseType〞 > <sequence>

<element name=〞 c_name 〞 type=〞 rgt:string〞 /><element name=〞 c_students 〞 type=〞 rgt:studentNoType〞 />

minOccurs=〞 0 〞 maxOccurs=〞 100〞 /> </sequence> <attribute name=〞 c_no 〞 type=〞 rgt:courseNoType〞 /> <! -- 定义主键 --> <key name=〞 courseKey〞 >

<selector XPath=〞 course〞 /><field XPath=〞@c_no〞 />

</key> <! -- 定义外键 --> <keyref name=〞 studentRef 〞 refer=〞 studentKey〞 >

<selector XPath=〞 course/c_students〞 /><field XPath=〞 text(c_students)〞 />

</keyref> </complexType>

11.4.1 XML 模式的示例 (4)

Page 45: 第 11 章  XML 技术

45

<! – 以下定义类型 simpleType--> <simpleType name=〞 setType〞 > <restriction base=〞 string〞 >

<enumeration value=〞男〞 /><enumeration value=〞女〞 />

</restriction> </simpleType>

<simpleType name=〞 courseNoType〞 > <restriction base=〞 string〞 >

<pattern value=〞 [A~ Z]{1}-[0~ 9]{3}〞 /> </restriction>

</simpleType> <simpleType name=〞 studentNoType〞 > <restriction base=〞 string〞 >

<pattern value=〞 [A~ Z]{1}-[0~ 9]{3}〞 /> </restriction>

</simpleType></schema>

11.4.1 XML 模式的示例 (5)

Page 46: 第 11 章  XML 技术

46

XML 模式的基本成分有名字空间、元素、主键、外键等。下面一一叙述。

1.名字空间在 XML 模式定义中,必须说明文档中所用的名字空间。一个模式可以有多个名字空间。但只有一个基本名字空间可以选作默认名空间,凡未说明的都是属于默认名空间,在例 11.9 中,用了两个名字空间: xsd和 rgt 。其中 xsd是W3C 组织公布的一个 xmlns 子名字空间。凡是属于这个名字空间的标签和类型,可冠以“ xsd:” 。后一个名字空间 rgt 是复旦大学的名字空间,简称为rgt ,也是 xmlns 的一个子名字空间,凡是属于这个名字空间的标签或类型至少在第一次出现时,都要加上“ rgt:”说明。

11.4.2 XML 模式的基本成分 (1)

Page 47: 第 11 章  XML 技术

47

2.元素XML 模式用 XML 文档的语法定义元素。属性作为

元素的一部分附在元素定义中。元素定义有复合类型( Complex Type )和简单类型( Simple Type )之分。如果元素含有子元素或属性,则其定义称为复合类型,否则称为简单类型。空元素含有属性,因而其定义也算复合类型。

XML 模式与 XML 文档一样,也是以 XML声明开始。然后用 <schema…> … </schema> 将整个模式定义括一起,以区别于一般的 XML 文档。

不管是复合还是简单类型,元素定义的基本格式如下:<element name=〞元素名 〞 type=〞类型名〞 />

11.4.2 XML 模式的基本成分 (2)

Page 48: 第 11 章  XML 技术

48

( 1 )复合类型的定义模式定义从根开始。根是个复合类型。· 复合类型定义用 <complexType>…</complexType>括

起,其中包含子元素定义和属性定义。· 子元素定义用 <sequence>…</sequence>括起。·属性定义附在子元素定义之后,无次序之分,其格式

为:<attribute name=〞属性名 〞 type=〞属性值类型〞 />

与 DTD 不同,属性定义附在其所属的元素定义之中,故可省去其中的所属元素名。

在 XML 模式中规定,在复杂类型定义中即使只有一种子元素,也要用 <sequence>…</sequence>括起。

11.4.2 XML 模式的基本成分 (3)

Page 49: 第 11 章  XML 技术

49

( 2 )简单类型的定义简单类型是在 xsd、 rgt 等名字空间所支持的基本

类型(譬如integer、 float、 decimal、 string、 booleam、 date 等)的基础上所定义的特殊类型。并可再加各式各样的限制条件从基本类型导出的各种简单类型。

譬如 courseNoType 用模板 [A~ Z]{1}-[0~ 9]{3}限制字符串,表示课程号由一个大写英文字母、连字符、三位十进制数字组成。 setType 是枚举类型,限制在男、女两个汉字上。

11.4.2 XML 模式的基本成分 (4)

Page 50: 第 11 章  XML 技术

50

3.主键和外键在 XML 模式中,主键和外键主要用于实体完整性和参照完整性约束的检查。在例 11.9 中,在元素student 中定义主键 s_no ,且在元素 course 中用作外键;另一方面,在元素 course 中定义主键 c_no ,而在元素 student 中用作外键。

而在 XML 中,由于元素是树形结构,不但有属性,其中还可能有多层子元素。 XML 的主键和外键不但来自属性,也可来自元素及其子元素的内容;不但来自本元素的内容及其属性,也可来自它的各层子元素的内容及其属性。为此,主键和外键必须用一组树形路径表示。这种用来定位主键和外键成员的路径,称为 XPath 。

11.4.2 XML 模式的基本成分 (5)

Page 51: 第 11 章  XML 技术

51

( 1 )主键的定义主键定义括在 <key>…</key>之中,其中含有主键名,作为调用主键的标识。 selector 标签用以定位主键成员所在的元素,用 XPath 表示其位置。 field 标签用以定位主键成员在元素中的位置。

( 2 )外键的定义外键定义括在 <keyref>…</keyref>之中,其中外键名用作调用外键的标识,关键字 refer 指出相应的主键名。 selector 标签用以定位外键成员所在的元素, field 标签用以定位外键成员所在的元素,用text ()函数取出该子元素的内容。

11.4.2 XML 模式的基本成分 (6)

Page 52: 第 11 章  XML 技术

52

4.其他数据结构下面再列出一些例子中为用到的但比较有用的结构。

( 1) list和 union 类型 list (列表)是同类型元素的无序集合。例 11.10 学生运动队学号表可以这样定义:

<simpleType name=〞 sportTeamList〞 ><list

itemType=〞 rtg:studentNoType〞 /></simpleType>

union (联合)是不同类型但有一定共性的元素可以组合成一个类型,与 C 语言中的 union 类型是一样的。

11.4.2 XML 模式的基本成分 (7)

Page 53: 第 11 章  XML 技术

53

例 11.11 目前中国区域电话号码有 8、 7、 6位等几种,可以用 union将这几种区域的电话号码联合成一种类型:

<simpleType name=〞 phoneNo〞 ><list memberTypes=〞 phone8digits phone7digits

phone6digits〞 /></simpleType>

即memberTypes 可指定为 union诸类型之一。其中phone8digits 可以这样定义:

<simpleType name=〞 phone8digits〞 ><restriction base=〞 integer〞 >

<minInclusive value=〞 10000000〞 /><maxInclusive value=〞 99999999〞 />

</restriction〞 ></simpleType>

phone7digits和 phone6digits也可类似定义。

11.4.2 XML 模式的基本成分 (8)

Page 54: 第 11 章  XML 技术

54

( 2 )组合符( Compositor )在定义复合类型时,有时需将多种元素组合成一个

语法单位,这类组合的标签称为“组合符”。前面提到 sequence (有序)是常用的一个,表示组

合成的元素是有序的。还有两个组合符: all (无序)和 choice (选择)。 all 表示组合成的元素是无序的。

choice 类似于 union 类型,用来联合异种类型,但choice 用于复合类型的联合,而 union只用于简单类型的联合。

11.4.2 XML 模式的基本成分 (9)

Page 55: 第 11 章  XML 技术

55

与 DTD 比较, XML 模式有下列优点:① 允许创建用户定义类型。② 允许在元素中出现的文本限制为特定类型,如特定格式的

数字类型或更复杂的类型( list或 union )。③ 允许为创建特定类型而对类型进行限制,如指定最小值或最大值。④ 允许使用继承性来扩展复合类型。

⑤ XML 模式是 DTD 的超集。⑥ 允许主键约束(惟一性)和外键约束(引用性)。⑦ 使用名字空间允许文档的不同部分遵从不同的模式。

⑧ XML 模式自身由 XML 语法指定。当然, XML 模式的这些优点付出的代价是它比 DTD 要复杂

得多。

11.4.3 XML 模式的优点

Page 56: 第 11 章  XML 技术

56

11.5 XML 查询和转换 (1)

11.5.1 XPath11.5.2 XSLT11.5.3 XQuery11.5.4 XML API

Page 57: 第 11 章  XML 技术

57

11.5 XML 查询和转换 (2)XML 数据的查询工具是从大的 XML 数据实体中提取信息,而 XML 数据的转换工具是在 XML 中的不同的表示(模式)之间进行转换。关系查询的输出是一个关系,而 XML 查询的输出则是一个 XML 文档。因此查询和转换可以结合在一个工具内。

现在主要有三个语言提供了 XML 数据的查询和转换能力:

·XPath 是一种基于路径表达式的语言,事实上也是下面两种语言的基础。

·XSLT 是一种转换语言,作为 XSL 样式表系统的一部分,用来控制将 XML 数据格式化为 HTML 和其他出版或显示语言。目前是最广泛采纳的用于操纵XML 数据的可用语言。

·XQuery 是作为查询 XML 数据的标准被提出的语言。

Page 58: 第 11 章  XML 技术

58

11.5 XML 查询和转换 (3)上述三个语言都使用了 XML 数据的树模型( Tree Model )。

一个 XML 文档被建模为一棵树,其结点对应元素和属性。元素结点可以有子结点,子结点可以是该元素的子元素或属性。除了根元素,每个结点(属性或元素)都有一个父结点元素。

XML 文档中元素和属性的顺序被建模为树的结点的子结点的顺序。树中的术语都可以移植到 XML 数据的树模型。

下面分别介绍这三个语言。

Page 59: 第 11 章  XML 技术

59

现在路径表达式中的分离操作不是用“ .” ,而是用“ /” 。路径表达式的结果是一个值的集合。譬如在例 11.8 的文档中,XPath 表达式

/university_2/student/s_name会返回下面这些元素:

<s_name>LIU</s_name><s_name>WEN</s_name>

而表达式 /university_2/student/s_name/text()则会返回相同的名字,但是没有包围的标签。

像目录层次一样,初始的“ /” 表示文档的根(这是一个抽象的根)。路径表达式的计算从左到右执行。

使用符号“@” 还可以访问属性值。譬如 “ /university_2/student/@s_no”,

则返回 student 元素中的所有 s_no值的集合( S246, S369 )。

11.5.1 XPath( 1 )

Page 60: 第 11 章  XML 技术

60

1.谓词可以在路径的每一个操作步骤中使用选择谓词(书写在方括号中)。例如

/university_2/student [s_age>25]返回 s_age值大于 25的 student 元素,而

/university_2/student [s_age>25]/@ s_no返回这些学生的学号。

我们还可以通过把一个子元素单独列出,而不使用任何比较操作的方式来测试该元素是否存在。譬如在上面的表达式中把“ >25” 去掉,则表达式就会返回具有 s_age 子元素的所有学生的 s_no值而无需考虑 s_age 的值。

11.5.1 XPath( 2 )

Page 61: 第 11 章  XML 技术

61

2.函数XPath 还允许使用多种函数,以丰富查询的语义。( 1) count ()函数用于表示查询对象的个数。譬如路径表达式

/university_2/student [count(s_courses)>2]/s_name返回有选修超过两门课程的学生的 s_name 子元素。逻辑操作符 and和 or也可以在谓词中使用,而函数 not(…)可以用于否定。

( 2) text ()函数用于返回元素的内容。譬如路径表达式 /university_2/student [text(s_courses)= 〞 C206〞 ]/s_name返回选修 C206课程的所有学生的 s_name 子元素。此时返回的结果是带有标签的子元素。若在结果前加上 text函数,即text(s_name) ,则可返回子元素的内容(不带标签)。

11.5.1 XPath( 3 )

Page 62: 第 11 章  XML 技术

62

( 3) first ()、 last ()函数分别表示从查到的对象中选取第一个或最后一个对象值。譬如路径表达式 /university_2/student/text

( s_courses[last()])

查询最后一名学生所选修的最后一门课程。在查询时,先依次列出所有 s_courses ,其中最后是所需要的 s_courses ,经 text ()函数作用后,可得结果为 C204 (见例 11.8 )。

11.5.1 XPath( 4 )

Page 63: 第 11 章  XML 技术

63

3.路径操作符,有下列五个:“ /” 用于分割操作步骤,“ .” 表示当前结点,“ ..” 表示当前结点的双亲节点,“ //” 表示搜索范围是整个文档树,“ *” 表示取所有子元素,“@*” 表示查询所有属性。

譬如路径表达式 /university_2/student [ @ s_no= 〞 S246〞 ]/* 其查询结果为: <s_name>LIU</s_name>

<s_age>22</s_age> <s_sex>男 </s_sex> <s_courses>

<s_c> <c_id>C206</c_id>

<score>85</score> </s_c>

</s_courses>XPath 是以导航式查询为主,目前还不支持两个元素的连接操作。

XPath虽然查询能力不强,却是后面两种语言的基础。

11.5.1 XPath( 5 )

Page 64: 第 11 章  XML 技术

64

样式表( Style Sheet )是文档的一种格式化表达方式,通常在文档本身的外部存储,所以格式与内容是分离的。

XML 样式表语言( XML Stylesheet Language )简记为 XSL。XSL最初的设计目标是用于从 XML 中产生 HTML ,因此 XSL是 HTML 样式表的一个逻辑扩展。

XSL 还包括一种通用变换机制,称为 XST 转换( XSL Tranformations ),简记为 XSLT。 XSLT 可以用来将一个XML 文档转换为另一个 XML 文档,或者转换成其他格式(如HTML )。

XSLT 转换可以表示为一系列的递归的规则,称为模板( Template )。模板既可以通过 XPath 表达式在 XML树中选择结点,也可以生成新的 XML 内容,从而使选择和内容生成能以一种自然的和强劲的方式组合在一起。虽然 XSLT 可以作为查询语言使用,但是其语法和语义都与传统的 SQL完全不同。实际上 XSLT 是一种函数或程序设计风范(譬如 LISP )的语言。

11.5.2 XSLT( 1 )

Page 65: 第 11 章  XML 技术

65

一个简单的 XSLT 模板包含下面两个部分:·匹配 (Match) 部分:用 XPath 表达式作为匹配条 件,选择一个或多个匹配结点;

·选择 (Select) 部分:按选择条件选用所需要 内容作为输出。

匹配是定位操作,选择是转换操作。实际上,模板是施加在源 XML 文档上的操作。通过一系列模板对源文档的作用,产生(转换成)输出文档(即查询结果)。下面举例说明非递归模板和递归模板的应用。

11.5.2 XSLT( 2 )

Page 66: 第 11 章  XML 技术

66

例 11.12 这是一个非递归模板的例子。仍以例 11.8的XML 文档为例。下面是由两个模板组成的样式表,试求查询结果。

<xsl:template match=〞 //student〞 ><studentList>

<xsl:value_of select=〞 s_name〞 /></studentList>

</xsl:template><xsl:template match=〞 .〞 />

上述样式表的目的是将原文档转换成下列形式:<studentList> LIU WEN </studentList>

也就是查询所有学生的姓名。由于 XLT 要求输出文档是 XML 文档,并必须要有根标签,因此学生名单用studentList 标签括起。

11.5.2 XSLT( 3 )

Page 67: 第 11 章  XML 技术

67

一个模板作用于源文档。匹配对象是所有 student 元素,匹配成功。 StudentList 是非 xsl名字空间的标签,按照 XSLT 的约定,凡是遇到非 xsl名字空间的标签,一律在输出文档中原样复制,即在输出文档中加上 <studentList>…</studentList> 标签。夹在其间的是模板的选择部分,即选出所有学生 s_name子元素的内容,剥去其标签。这样,在执行第一模板后,在输出文档中已经形成了所需的结果。如果标记 value_of用copy_of 代替,则 s_name 子元素将被复制到输出文档,即不剥去标签 s_name 。

第二个模板是空模板,只有匹配部分,没有选择部分。它的匹配对象是当前结点,匹配总是可以成功的。由于没有选择部分,它对输出文档没有任何影响。由于 XSLT 有个约定,如果源XML 文档不能与任何一个模板匹配,则将源文档全部复制到输出文档。为了避免出现这种无意义的操作,在最后加上这个总是可以匹配的空样板。

11.5.2 XSLT( 4 )

Page 68: 第 11 章  XML 技术

68

例 11.13 这是一个递归模板的例子。列出每个学生所选的课程。<xsl:template match=〞 /university_2/student〞 >

<s_courseList><!-- 在模板中调用模板,是个递归的过程 --><xsl:apply_templates/>

</s_courseList></xsl:template><xsl:template match=〞 student〞 >

<courseTaking><!—从子元素 s_name和 s_courses 中提取其值 --

><xsl:value_of select=〞 s_name〞 /><xsl:value_of select=〞 s_courses〞 />

</courseTaking></xsl:template><xsl:template match=〞 .〞 />

11.5.2 XSLT( 5 )

Page 69: 第 11 章  XML 技术

69

上述样式表共有三个模板。查询结果为:<s_courseList>

<courseTaking>LIU C206

</courseTaking><courseTaking>

WEN C204</courseTaking>

</s_courseList>XSLT目前还不直接支持连接操作,查询能力还很有

限。但 XSLT 的语法结构与 XML 一致,且 XSL 本身就是 XML 的一部分,采用 XSLT 作为 XML 查询语言,可以利用现成软件,这也是 XSLT 的可取之处。

11.5.2 XSLT( 6 )

Page 70: 第 11 章  XML 技术

70

W3C 组织开发了 XQuery ,一种 XML 的查询语言。 XQuery主要来自于 Quilt的 XML 查询语言,并吸取了 XQL、 XML-QL等 XML 查询语言以及 OODB的 OQL 的特点,它的查询功能极强,与 SQL风格相近,一时数据库界乐于接受的一种XML 查询语言。与 XPath 相比, XQuery 是一种非过程性语言,不用 XML 表示查询,而用类 SQL 查询,并引进了变量。

Xquery 有四个基本子句:·for 子句:给出了在 XPath 表达式结果集范围上的一系列变量。

for 子句实质上类似于 SQL 查询的 FROM 子句。·let 子句:允许复杂表达式赋值给不同的变量名称以简化表达。·where 子句:说明查询结果应满足的条件(包括连接条件)。·return 子句:将查询结果以 XML 文档形式返回。 Return 子句 在功能上接近于 SQL 中的 SELECT 语句。

XQuery 的查询也称为“ FLWR” (发音为“ flower” )表达式,FLWR取自四个子句的英文单词的第一个字母。

11.5.3 XQuery( 1 )

Page 71: 第 11 章  XML 技术

71

例 11.14 列出所有男学生的学号和姓名:for $x in /university_2/studentlet $s_no:=$x/@s_no $s_name:=$x/text( s_name )where $x/text( s_sex) = 〞男〞return <studentTable> $s_no $s_name

</studentTable> sortby ( $s_no )在 XQuery 中,冠以 $ 的符号代表变量。在 for 子句中, $x界

定查询范围。在 let 子句中,定义两个变量 $s_no、 $s_name ,分别代表学号和姓名(均无标签)。 where 子句是选择 $x 的条件。最后, return 子句按 XML 文档形式输出结果,查询结果为:

<studentTable>S246 LIUS369 WEN

</studentTable>

11.5.3 XQuery( 2 )

Page 72: 第 11 章  XML 技术

72

例 11.15 列出所有女学生的姓名及其所选修课程的课程号、课程名和成绩。这个查询需要在 student与 course之间进行连接,可采用嵌套查询法。以 student 为外循环变量, course 为内循环变量。for $x in /university_2/student

where $x/text(s_sex)= 〞女〞 <courseTaking>

$x/s_name(for $y in /university_2/course where $x/text(s_courses)= $y/@c_no return <courseData>

$y/@c_no $y/text(c_name) $y/text(score) </courseData>)

</courseTaking>

11.5.3 XQuery( 3 )

Page 73: 第 11 章  XML 技术

73

查询结果为:<courseTaking>

<s_name> WEN </s_name><courseData> C204 OS 100 </courseData>

</courseTaking>XQuery 还提供了许多预定义函数。例如 document() 可以返回参数的根元素; distinct() 可以消除参数中的重复项; empty()可以判断参数是否为空; filter() 用于剪除文档中不需要的部分,相当于过滤器,其作用与关系数据库中的投影操作类似。 XQuery 还允许自定义函数。

虽然 XQuery 不提供 group by 结构,但可以用嵌套的 FLWR结构来代替分组书写聚集查询。 XQuery 支持存在量词 (用some 限定 ) 和全称量词 (用 every 限定 ) ,是一种功能全面、与 SQL风格相近的一种 XML 查询语言。但 XQuery 的语法结构与 XML 相差甚远。

11.5.3 XQuery( 4 )

Page 74: 第 11 章  XML 技术

74

随着 XML 作为一种数据表示与交换格式的广泛普及,用于处理 XML 数据的软件工具也大量出现。现在 W3C 组织和其他团体为 XML 提供两种应用程序设计接口( API )。

1.基于树形结构的 API这些 API 类似于早期的层次、网状数据库语言,可供应用程序在 XML 文档树形结构上进行导航式访问,提供诸如getParentNode() (访问双亲结点)、 getFirstChild() (访问第一个子结点)、 getNextSibling() (访问下一个孪结点)、 getAttribute() (访问属性)、 getData() (访问元素的内容)以及增、删、改等命令。

基于树形结构的 API 的模型称为文档对象模型( DOM )。书写实际的 DOM 程序还需要更多的细节。 DOM 可用于访问存储在数据库中的 XML 数据,我们可以构建一个 XML 数据库将 DOM 作为其访问和修改数据的主要接口。然后, DOM接口不支持任何形式的说明性查询。

11.5.4 XML API( 1 )

Page 75: 第 11 章  XML 技术

75

2.基于事件的 XML 简单 API这是一种事件模型,设计成用于提供一个语法分析器

和应用程序之间的通用接口。这种 API基于事件处理程序的概念构建,是由与语法分析事件相关联的用户指定函数构成的。语法分析事件是与文档的组成部分的识别相关的。例如,当找到一个元素的开始标签时就产生一个事件,而当找到结束标签时又产生一个事件。一个文档的不同成分分片总是可以按照从开始到结束的顺序找出。但这种接口不适用于数据库应用。

上述两种 API 为自动处理 XML 文档提供了简单的基本接口。但这是一种低级接口,用作查询语言显然是不够的。还需有基于这两个 API 软件开发工具,来提供非过程性或说明性的查询格式。

11.5.4 XML API( 2 )

Page 76: 第 11 章  XML 技术

76

11.6 XML 数据的存储

11.6.1 关系数据库11.6.2 非关系的数据存储

Page 77: 第 11 章  XML 技术

77

将 XML 数据存储到关系数据库中,有以下三种可选方法。

1.按字符串存储这种方法把上层元素看成一个关系,而子元素为关系

中的属性。尽管这方法很容易实现,但 DBS 并不知道存储的元素

的模式,将导致不能直接查询数据。即使是简单的查询,也会扫描关系中的所有元组。

像 Oracle 9系统支持函数索引,有助于避免在 XML字符串和关系属性之间的重复存储。与基于属性值的索引不同,函数索引是基于将用户定义的函数作用在元组之上的结果来构建。

这个方法的缺点是, XML 信息的很大一部分存储在字符串中。

11.6.1 关系数据库( 1 )

Page 78: 第 11 章  XML 技术

78

2.树表示法任意 XML 数据被建模为树,并用一个关系对来保存:

nodes( id, type, label, value )child( child_id, parent_id )

XML 数据中每个元素和属性都有一个惟一的标识符。对每一个元素和属性,有一个含有标识( id )、类型(元素或属性)、元素或属性的名字( label )、元素或属性的文本值( value )的元组被插入到 nodes 关系中。关系 child 用于记录每个元素或属性的父元素,来指出子结点在兄弟结点中的相对位置。

这种方法的优点是所有的 XML 信息都可以直接用关系的形式表示出来,而且许多 XML 查询可以被翻译为关系查询并在 DBS 内部执行。其缺点是每个元素被分成很多部分,元素的重组需要大量的连接操作。

11.6.1 关系数据库( 2 )

Page 79: 第 11 章  XML 技术

79

3.映射为关系这个方法是将已知模式的 XML 元素映射为关系和属

性。未知模式的元素按字符串存储,或按树表示。对每个已知模式的元素类型都创建一个关系,这些元素的所有属性作为该关系的属性存储。在这些元素中最多出现一次的所有子元素同样表示为该关系的属性。如果子元素仅仅包含文本,属性就保存文本值。否则,与该子元素的有关关系就存储该子元素的内容和父元素类型的标识,而属性储存子元素的标识符。

如果某个子元素可以在一个元素中出现多次,则映射为关系的方法将子元素的内容存储在与该子元素相关的关系中。对父结点和子结点分配惟一标识符,并创建独立的关系来标识哪个元素出现在哪个父结点下。

11.6.1 关系数据库( 3 )

Page 80: 第 11 章  XML 技术

80

把 XML 数据存储到非关系的数据存储系统,有下面两种可选方法。

1.存储在平面文件中XML 是一种文件格式,那么最自然的存储方式就是

简单的存储在平面文件中。这种文件系统方式作为数据库应用的基础有着许多缺点:数据冗余、数据不一致、数据联系弱等,还有缺少数据隔离、完整性检验、并发访问和安全性等问题。然而,作用与文件数据上的 XML工具的广泛使用使得访问和查询存储在文件中的 XML 数据相对容易些。这种存储格式对某些应用程序是足够的。

11.6.2 非关系的数据存储( 1 )

Page 81: 第 11 章  XML 技术

81

2.存储在 XML 数据库中XML 数据库是指使用 XML 作为其基础数据模型

的数据库。早期的 XML 数据库实现了基于 C++的 OODB 上

的文档对象模型( DOM )。这使得许多 OODB基础架构能够得到重用,同时采用一个标准的XML接口。 XML 查询语言的加入提供了说明性的查询方法。同时,构建 XML 数据库作为关系数据库上面的中间层也是有可能的。

11.6.2 非关系的数据存储( 2 )

Page 82: 第 11 章  XML 技术

82

XML 是一种能够表述比传统数据模型中的数据结构化程度低的数据的语言。与对象数据库相比, XML也提供了一条途径来表示有嵌套结构的数据,但在数据结构化方面有非常大的灵活性。

XML 形成于 1998 年。现在 XML 已形成为数据交换的主倒格式。传统的大型 DBMS 中都加入了支持XML功能的模块。 DBS 不但可以用 XML 文档的形式向WWW 提供其中的数据,而且还可以直接管理XML 文档。 XML 技术使得文档管理与数据管理逐步融合,而 DBS 成为 WWW 中的数据服务中心。

XML 文档常用的语法成分有声明、元素、属性、引用和注释等部分。

11.7 小结( 1 )

Page 83: 第 11 章  XML 技术

83

XML 文档类型定义( DTD )是对 XML 文档的结构和约束的定义。 DTD 主要包括元素类型声明和属性声明两个部分。

为了弥补 DTD 的不足,提出了 XML 模式标准,其用途主要用于 XML 文档的正确性检查。 XML 模式的基本成分有名字空间、元素、主键、外键等。

提供了 XML 数据的查询和转换能力语言有XPath、 XSLT和 XQuery 等三个。 XPath 是导航式语言, XSLT 是函数式语言, XQuery 是非过程性语言。现在正处于标准化过程中的 XQuery 是始于 Quilt查询语言,并且与 SQL 很相似。

存储 XML 数据的主要方法是将其转换成关系,再存储到关系数据库中。

11.7 小结( 2 )