版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章XML数据库11.1XML简介11.2XML文档11.3DTD-XML模式定义语言11.4XMLSchema-XML模式定义语言11.5Xpath查询语言11.6XQuery查询语言11.7XML应用程序接口11.8SQL/XML标准11.9小结11.1XML简介
11.1.1XML的特点与HTTP相比,XML有如下特点:(1)更多的结构和语义。(2)可扩展性。(3)简单易用。(4)自描述性。(5)数据与显示分离。11.1XML简介11.1.2XML的应用由于XML是一种元语言,可以由使用者自行定义。以下为它的各方面应用:(1)XML/EDI电子数据交换(2)化学标识语言CML和数学标识语言MATHML(3)开放式软件描述格式OSD(4)通道定义格式CDF(5)开放式财务交换OFX11.1XML简介11.1.3XML的相关标准(1)XML数据模型
XML可以看作是半结构化数据的特例,但目前没有公认的很好的数据模型表示它。W3C已经提出的有:XMLInformationSet,XPath1.0DataModel,DOMmodel和XMLQueryDataModel。总的来说,这四种模型都采用树结构,XMLQueryDataModel是其中较为完全的一种。11.1XML简介11.1.3XML的相关标准(2)XML模式定义:
XML数据没有强制性的模式约束。在XML标准中,有一个可选项:DTD(DocumentTypeDefinition),它描述了XML文档的结构,类似于模式。W3C提出了定义XML模式的另外两个标准XMLSchema和DocumentContent。11.1XML简介11.1.3XML的相关标准(2)XML模式定义
Descriptors(DCDs),它们是对DTD的扩展。XMLSchema用XML语法来定义其文档的模式,支持对结构和数据类型的定义,更适合作为数据模式的定义标准。11.1XML简介11.1.3XML的相关标准(3)XML查询语言针对XML数据的特点,学者们已经提出了许多的查询语言,如XML-QL,XQL,及Quit等。在这些已有的查询语言基础上,W3C提出了一种查询语言XQuery,它结合了其它语言的优点,具有非常强大的能力。11.1XML简介11.1.3XML的相关标准(3)XML查询语言XQuery由被称作查询模块的单元组成,这些单元之间彼此相对独立,可以进行任意层次的嵌套,完成变量绑定、条件判断、查询结果构造等功能。XQuery采用了与XPath一致的语法来表示路径表达式。11.1XML简介11.1.3XML的相关标准(4)其它标准
W3C提出了与XML相关的一系列标准,内容涉及数据的表示、传输、查询、转化等许多方面。除了前面提到的外,还有描述XML文档内和文档间元素关系的XLink和XPointer,以及XML数据的传输协议标准SOAP等许多其它标准。11.1XML简介11.1.4XML的存储
XML数据库是一个能够在应用中管理XML数据和文档的数据库系统,一个XML数据库是XML文档及其部件的集合,并通过一个具有能够管理和控制这个文档集合本身及其所表示信息的系统来维护。11.1XML简介11.1.4XML的存储XML数据库不仅是结构化数据和半结构化数据的存储库,像管理其它数据一样,持久的XML数据管理包括数据的独立性、集成性、访问权限、视图、完备性、冗余性、一致性以及数据恢复等。11.1XML简介11.1.4XML的存储(1)平面文件数据库平面文件是最简单的存储方案,就是在一个文件中存储整个的XML文档,以多种文本编辑器和几个XML工具作为数据操纵工具来实现XML数据的操纵。平面文件存储方案的优点是实现简单,但是存在两个主要的局限性:快速访问和索引。这也影响了平面文件数据库的其它方面的能力:有效的日志更新、事务和执行恢复。11.1XML简介11.1.4XML的存储(2)XED——面向对象数据库和关系型数据库
XED是在原有数据库基础上扩展了XML支持模块,完成XML数据和数据库之间的格式转换和传输。其存储粒度可以把整个XML文档作为RDBMS表中一行,或把XML文档进行解析后,存储到相应的表格中。11.1XML简介11.1.4XML的存储(2)XED——面向对象数据库和关系型数据库 这种存储方案的优点是效率高、查询方便、有大量的支持工具。但也存在着一些缺点:将树状结构的XML数据转换成关系数据库的二维关系表形式时面临语义信息丢失的问题;XML查询(例如XPath和XQuery)等不能直接在关系数据库上执行,需要转换成SQL查询;而且其关系表形式的查询结果还必须得还原成树状形式的XML数据;查询执行和数据存储的代价会受XML数据的映射方案的影响可能会变得较大。11.1XML简介11.1.4XML的存储(3)NXD——专门的XML数据库管理系统所谓的XML的Native存储方式,就是存储时保留数据的树模型模式。根据一个节点可以直接找到其孩子节点、左右兄弟节点或父亲节点等。以Native方式存储的XML数据,保留XML数据的树状模型,并支持XPath和XQuery等XML查询以读取数据。存取XML数据,就无需进行数据模式的转换,也不需要进行查询语言的转换。11.2XML文档XML规范定义了一组语法用于描述文档的内容和结构。[例1]XML文档实例<?xmlversion="1.0"encoding="GB2312"?><!DOCTYPENewListSYSTEM"NewList.DTD"><StudentList> <Student> <Sno>2000012</Sno> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>计算机</Sdept></Student></StudentList>11.2XML文档XML规范要求XML文档的第1行必须是一个声明,用于说明XML文档所遵从的XML标准版本和语言等。XML文档的主体是一系列的元素。元素有开始标签(tag)和结束标签,标签又被称为元素名,两个标签之间的部分被叫做元素的内容。开始标签是一个字符串,并且被封闭在符号’<’和’>’中。结束标签是在标签标记字符串之间加上符号’/’。11.2XML文档在HTML文档中,标签是预先定义好的,有固定的含义,可以被浏览器所理解。在XML文档中,标签需要用户自己创建。标签的命名必须遵守下面的规则:可以包含字母,数字和其它字符。不能以数字或者标点符号开头。不能以XML(或者xml,Xml,xML...)开头。不能包含空格11.2XML文档
一个元素可以包含另外的一个元素,称为元素嵌套,元素之间的嵌套关系是一个层次关系,可以被表示为树。
XML文档必须有根元素。元素还可以有任意多个用户自定义的属性(Attribute),用于对元素作进一步的描述和说明。
XML中的每个属性都有自己的名字和值,属性是开始标签的一部分。
XML规范要求属性值必须放在一对引号内。11.2XML文档属性的特点有:1.属性之间的次序是不重要的。一个属性在同一个元素中不能出现多次。可以声明属性类型为ID,这样的属性在整个文档中必须有唯一值。属性有时可以使得展现更加简洁。11.2XML文档除了元素和属性,XML还允许使用处理指令和注释。处理指令以”<?”开始,以”?>”结束,中间是处理指令名称和数据。注释以”<!--”开始,以”-->”结束,这两个标记之间是用于注释的内容,注释可以出现在文档中的任何位置。11.3DTD-XML模式定义语言DTD是一种保证XML文档格式正确的有效方法。一个DTD文档包含:元素的定义规则,元素之间的嵌套关系的定义规则,元素可使用的属性,可使用的实体或符号规则等。DTD通过具体说明元素和属性的名称、元素与子元素之间的嵌套关系、子元素的出现次数等来定义XML文档的结构模型。DTD使用操作符*(0次或多次)、+(至少1次)、?(0次或1次)、|(或选)来定义子元素的出现次数。11.3DTD-XML模式定义语言 DTD假设元素的内容和属性的值都是字符串类型,也提供了一些特殊类型。ANY类型能够是一个任意XML片段;ID类型说明一个属性的值在整个文档中是唯一的,被用来在文档中惟一标识一个元素。IDREF或IDREFS类型说明属性的取值为另一个或另几个元素的ID属性的值,用于实现该元素对其它元素的引用。
11.3DTD-XML模式定义语言
在DTD中元素类型定义由它们的元素内容模型来描述,其形式为<!ELEMENT元素名(元素内容模型)>
定义属性时,使用下面的格式:<!ATTLIST元素名(属性名属性类型默认声明)*>11.3DTD-XML模式定义语言
元素名是属性所属的元素的名字,属性名是属性的命名,属性类型则用来指定该属性是属于有效属性类型中的哪种类型,默认声明用来说明该属性在XML文件中是否可以省略以及默认值是什么。在DTD中共有三种声明形式:一是#REQUIRED,表示该属性在XML文件中是必须出现的;二是#IMPLIED,表示该属性在XML文件中是可以省略的;三是声明默认属性值。11.3DTD-XML模式定义语言[例2]XMLDTD实例<!DOCTYPEStudentList[<!ELEMENTStudentList(Student+)><!ELEMENTStudent(Sno,Sname,Ssex,Sage,Sdept,CourseList)><!ELEMENTCourseList(Course+)><!ELEMENTCourse(Cname,Grade)><!ATTLISTCourseCcreditCDATA
#REQUIRED><!ELEMENTSno(#PCDATA)><!ELEMENTSname(#PCDATA)><!ELEMENTSsex(#PCDATA)><!ELEMENTSage(#PCDATA)><!ELEMENTSdept(#PCDATA)><!ELEMENTCname(#PCDATA)><!ELEMENTGrade(#PCDATA)>]>11.4XMLSchema-XML模式定义语言XMLSchema的出现就是为了解决DTD的语法与xml的不一样这种缺点。
W3C于1998年开始制定XMLSchema的第一个版本,在2001年5月正式由官方推荐。正式推荐的版本包括以下三部分:11.4XMLSchema-XML模式定义语言XMLSchemaPart0:Primer。这是对XMLSchema的非标准介绍,提供了大量示例和说明。XMLSchemaPart1:Structures。这部分描述了XMLSchema的大部分组件。XMLSchemaPart2:Datatypes。这部分包括简单数据类型,解释了内置的数据类型和用于限制它们的方面(facet)。11.4XMLSchema-XML模式定义语言[例3]xmlscheme的实例<?xmlversion="1.0"?><xsd:schemaxmlns:xsd="/2001/XMLSchema"> <xsd:elementname="StudentList"> <xsd:complexType> <xsd:sequence> <xsd:elementname="Student"type="StudentType"minOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>11.4XMLSchema-XML模式定义语言XMLSchema规范制定了相关的标准描述XML文档的模式,主要有以下几个方面:1、元素和属性在XML模式中用xsd:element元素声明XML文档的元素,用xsd:attribute元素声明XML文档元素的属性。这两个元素名称在前缀xsd所指向的命名空间中有定义。11.4XMLSchema-XML模式定义语言 在每个xsd:element或xsd:attribute元素中,name和type属性分别用来说明XML文档元素或属性的名称和数据类型。 每个XML文档的元素或属性都有一个数据类型。XMLSchema把元素、属性的概念和其数据类型分开,这就允许为结构相同的数据定义不同的名称。11.4XMLSchema-XML模式定义语言
2、数据类型 在XMLSchema中有三种方法来指定元素的数据类型1.通过在元素声明中指定Type属性来引用一个已命名的数据类型、内置数据类型或用户派生数据类型。2.通过定义SimpleType或ComplexType子元素来指定元素的匿名数据类型。3.既不指定Type属性,也不定义SimpleType或ComplexType子元素。11.4XMLSchema-XML模式定义语言(1)简单类型简单类型有三种:原子类型、列表类型和联合类型。(2)复杂类型复杂类型的元素内容可以包含子元素或属性。XMLSchema中用complexType元素定义一个复杂类型。它的name属性用来指定所定义复杂类型的名称,可以通过内容模型来对复杂类型进行分类。复杂类型子元素的顺序和结构称为它的内容模型。11.4XMLSchema-XML模式定义语言复杂类型的内容模型共有以下四种:1.简单内容。简单内容只允许有字符数据,它没有子元素。2.纯元素内容。纯元素内容只有子元素而没有字符数据内容。3.混合内容。混合内容既允许有字符数据又允许有子元素。4.空内容。空内容既不允许有字符数据也不允许有子元素,这样的元素通常带有属性。11.4XMLSchema-XML模式定义语言(3)匿名与命名数据类型可以是命名的,也可以是匿名的。命名类型总是被定义为全局的,即在模式文档的最高层,它的父节点总是Schema,并要求具有惟一的名称。相反,匿名类型则没有名称,它们总是在元素或属性声明内定义,而且只能被该声明使用一次。11.4XMLSchema-XML模式定义语言(4)全局与局部
XMLSchema组件有全局和局部之分全局组件出现在模式文档的最高层在整个模式文档中,它们的名称必须在同类组件中是惟一的。 局部组件则限定在包含它们的定义或声明的作用域内。 简单类型和复杂类型也可以定义为局部的,这时它们是匿名的。
11.4XMLSchema-XML模式定义语言(4)全局与局部 不能被定义它们的元素和属性声明之外的其它元素和属性声明引用。 全局的元素声明和类型定义出现在模式文件的最顶层,它的父元素是Schema局部元素和属性声明只出现在复杂类型定义内部。11.5XPath查询语言
XML查询语言的功能是在XML文档中找出满足指定条件的文档片段。
Xpath是一种轻量级的XML查询语言,它使用路径表达式描述要查找的元素、属性等,路径表达式与UNIX文件系统定位文件的方法十分类似,例如,/StudentList/Student/Sno就是一个路径表达式。11.5Xpath查询语言11.5.1数据模型为了能按照统一的方式操纵所有的XML文档,XPath把XML文档抽象为树。XML文档中的元素、属性、文本、注释、处理指令、命名空间作为树中的节点,元素之间的嵌套关系在树中用节点之间的父/子关系和祖先/后裔关系表示。11.5Xpath查询语言
11.5.1数据模型此树的一部分如图所示rootStudentListsStudentStudentSnoSnameSsexSdeptSageCourseLists2000012计算机王林男19CourseCnameGradeCcredit80英语CourseCnameGradeCcredit70管理学Courses图11.1一个查询数据模型实例11.5Xpath查询语言
11.5.1数据模型对于Xpath的树模型要注意以下几点1、树是有序树,节点之间的父子关系、兄弟关系必须同它们在文档中的次序一致,采用深度优先对树进行遍历,可以得到原始的文档。2、根据树的术语,如果节点P是节点C的父亲,则节点C一定是节点P的孩子节点。11.5Xpath查询语言11.5.1数据模型3、文档中元素的开始标签和结束标签之间的文本在数中用一个节点表示,并作为元素的孩子节点。但是,却不为属性的值建立一个节点,属性的值作为属性节点的一部分被保存。4、为了更清晰的表示,图11.1中的每个节点我们只给出一部分内容,实际上,每种节点类型是一个类,有若干个属性和方法,节点是节点类型的实例。11.5Xpath查询语言11.5.2路径表达式 XPath路径表达式有以下两种形式: /locationStep1/locationStep2/.....(1) locationStep1/locationStep2/.....(2)11.5Xpath查询语言11.5.2路径表达式 形式(1)为绝对路径表达式,表示从树模型的根节点开始,如何走到目标节点。 形式(2)为相对路径表达式,表示从当前节点(又叫做上下文节点)如何走到目标节点。11.5Xpath查询语言11.5.2路径表达式路径表达式由若干个定位步(locationStep)组成,每个定位步指明了下一步要走到哪些节点,定位步的形式为: Axis::nodeSelector[selectionCondition]
定位步的结果是一个节点的集合,这些节点具有相同的节点类型。 XPath定义了13个轴,如下表所示:11.5Xpath查询语言表11.1XPath的轴(a)轴名称结果self选取当前节点。parent选取当前节点的父节点。child选取当前节点的所有子节点。ancestor选取当前节点的所有祖先(父、祖父等)ancestor-or-self选取当前节点的所有祖先(父、祖父等)以及当前节点本身descendant选取当前节点的所有后代节点(子、孙等)。descendant-or-self选取当前节点的所有后代节点(子、孙等)以及当前节点本身。preceding选取文档中当前节点的开始标签之前的所有节点。11.5Xpath查询语言preceding-sibling选取当前节点之前的所有同级节点。following选取文档中当前节点的结束标签之后的所有节点。following-sibling选择上下文节点的所有在其后(右)的兄弟,如果上下文节点是属性节点或命名空间节点,则followin-sibling轴为空。attribute选取当前节点的所有属性namespace选取当前节点的所有命名空间节点表11.1XPath的轴(b)11.5Xpath查询语言11.5.2路径表达式 明确了定位步的语义(即求值方法)后,下面给出XPath路径表达式语义: 从当前节点出发,找出所有locationStep1到达的节点,对于其中每个节点N,找出所有从N出发,经过locationStep2到达的节点,然后将所有经过locationStep2到达的节点合并,再对合并中的每一个节点,应用locationStep3……直到最后一个步骤,最后一步得到的节点集合就是路径表达式的结果。11.5Xpath查询语言[例4]
找到所有Sno节点/child::StudentList/child::Student/child::Sno路径表达式可以使用简缩句法,常用的缩减句法有:self::→./child::→//descendant-or-self::node()→//parent::→..attribute::→@谓词[position()=数值表达式]→[数值表达式]例4的简写路径表达式为:/StudentList/Student/Sno11.5Xpath查询语言[例5]
找出王林所选修的学分大于4的课程名称节点 //Student[Sname="王林"]//Course[@Ccredit>"4"]/Cname 将所有的Student节点作为一个集合,从中选择出有Sname子元素,并且Sname的值等于"王林"的Student节点。把每个筛选出的Student节点作为上下文节点,找到它的后裔节点Course,并且这个后裔节点必须有属性Ccredit,其值大于4。将满足条件的Course作为上下文节点,找出其Cname孩子节点。11.5Xpath查询语言11.5.3XPath函数XPath函数大体上可以分为以下几类:1、存取函数:各种节点类型共有的函数,用于读取节点的属性值。2、错误跟踪函数:对查询进行Debug,向外部环境传递错误信息。3、数学函数:常用的数学函数,如abs()。4、字符串函数:用于处理字符串的系列函数,如compare()、concat()。11.5Xpath查询语言5、布尔值函数:返回逻辑值,如boolean()。6、时间日期函数:用于处理时间和日期的系列函数,如datetime()。7、限定名(QName)相关函数:返回节点的Qname、localname和namespace,如QName()、local-name-from-QName()。8、节点相关函数:返回节点的名字等,如root()、name()。11.5Xpath查询语言[例6]
返回文档中第1个学生的信息。
//Student[position()=1][例7]
给出元素Student的限定名、本地名和命名空间的URI。name(//Student) 返回sql:Studentlocal-name((//Student)[1]) 返回Studentnamespace-uri((//Student)[1]) 返回/Student.XML[例8]
给出学号为2000012的Student节点ID("2000012")返回的节点同//Student[1]11.6.1FLWOR表达式
XQuery最有特色且最重要的语法类型之一是FLWOR(读作flower)表达式,和SQL的select-from-where语句类似,并且具有相似的功能。 FLOWER各字母分别代表for、let、where、order以及return表达式。每个FLWOR表达式都有一个或多个for子句、一个或多个let子句、一个可选的where子句以及一个return子句。11.6XQuery查询语言1.for子句就像SQL的from子句,在一个序列上变动,序列是项(item)的集合,项可以是节点也可以是原子值。2.let子句将变量直接与一个完整的表达式绑定在一起。与for子句循环遍历序列中的每个项所不同的是let子句将变量绑定到整个序列。11.6XQuery查询语言3.where子句如同SQL的where子句一样,对来自for子句的变量进行过滤。4.order子句能指定结果的顺序,这与SQL中的orderby子句非常类似。5.return子句构造XML形式的结果。11.6XQuery查询语言[例9]
构造一个XML文档,文档中描述了每个学生所选修的超过4学分的课程名称for$Studentindocument("Student.XML")//Studentlet$Sname=$Student/Snamelet$Course=$Student//Course[@Ccredit>="4"]return<CourseInfo>{$Sname}{$Course/Cname}</CourseInfo>11.6XQuery查询语言将上面的查询应用于例1的XML文档,则返回的结果为:<CourseInfo> <Sname>王林</Sname> <Cname>英语</Cname> <Cname>管理学</Cname> <Cname>数据库原理</Cname> <Cname>离散数学</Cname></CourseInfo><CourseInfo> <Sname>张大民</Sname> <Cname>英语</Cname></CourseInfo>11.6XQuery查询语言11.6.2连接Student.XML的部分内容<Student> <row> <Sno>2000012</Sno> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>计算机</Sdept> </row></Student>11.6XQuery查询语言Course.XML的部分内容<Course> <row> <Cno>1156</Cno> <Cname>英语</Cname> <Cpno></Cpno> <Ccredit>6</Ccredit> </row></Course>11.6XQuery查询语言SC.XML的部分内容<SC> <row> <Sno>2000012</Sno> <Cno>1156</Cno> <Grade>80</Grade> </row></SC>11.6XQuery查询语言[例10]
求学生2000012选修的每门课程的名称和成绩<root>for$Cnoindocument("SC.XML")//Sno[text()="2000012"]/Cno,$Courseindocument("Course.XML")//rowwhere$Cno=$Course[Sno="2000012"]/Cnoreturn {$Course/Cname} {$Cno/../Grade}</root>11.6XQuery查询语言11.6.3嵌套查询[例11]
求出每位学生的平均成绩。<root> for$Snoindocument("Student.XML")//Sno return {$Sno/../Sname} <avgGrade> {avg(document("SC.XML")/row[Sno=$Sno]/Grade)} </avg-Grade></root>11.6XQuery查询语言11.6.4结果的排序 可以用orderby子句对查询结果排序。[例12]排序输出学生的名字。 for$Snameindocument("Student.XML")//Sname orderby$Sname return {$Sname}11.6XQuery查询语言
随着XML应用领域的不断推广,各种处理XML文档的编程接口也应运而生。其中JAXP(全称JavaAPIforXMLProcessing)是使用Java语言编写的编程接口,JAXP对XML文档有基于对象(例如,DOM)和基于事件的两种解析方式。基于事件的解析方式又分为推入式解析(例如SAX)和拉出式解析(例如Satx)11.7XML应用程序接口11.7.1SAX SAX是SimpleAPIforXML的缩写,它并不是由W3C官方所提出的标准,而是在1998年的早些时候由DavidMegginson所提出,目标是成为基于事件驱动的XML文档解析模式的标准API。
11.7XML应用程序接口11.7.1SAXSAX解析xml如图11.211.7XML应用程序接口图11.2SAX解析XML文档11.7.2DOM DOM(文档对象模型)是对XML数据的描述体系,它用树型结构来保存XML文档。此外,DOM也包括了解析、处理XML数据的API。
DOM整体上的结构是一个Composite模式。所有的XML单元,无论是文档、元素还是属性、文本,在DOM中都是一个Node(节点)。11.7XML应用程序接口11.7.2DOMDOM的存储方式如图11.311.7XML应用程序接口图11.3DOM存储形式11.7.2DOM下面介绍一下如何操作文档:1、文档的生成用DOM处理XML数据,需要以下三个步骤1.创建DocumentBuilderFactory。2.创建DocumentBuilder。DocumentBuilder将对输入实例进行解析以创建Document对象。3.解析输入的XML,创建Document对象。11.7XML应用程序接口11.7.2DOM2、文档的遍历 DOM采用了Composite模式。Node类是所有XML单元的基类,Element、Attr、Document等等都是Node的派生类。每个Node都可以包容其它的Node,也可以包容文本格式的内容。
11.7XML应用程序接口11.7.2DOM
首先要获取文档的根节点Document.getDocumentElement()方法。 获取根节点后,Node.getChildNodes()方法得到该节点的所有直接孩子节点,从而遍历整个树型结构。11.7XML应用程序接口11.7.2DOM 在DOM中“元素”是指一对标签(tag)及其内部包含的字符串值的总和,处理一个元素的内容时,需要两个步骤:
1.找到代表该元素的节点
2.处理该节点的第一个孩子节点对于树型数据结构,常见的节点处理就是节点的插入、删除和替换。
11.7XML应用程序接口11.8.1发布XML文档
SQL/XML提供了一组函数发布XML文档 其函数如下:
1、SQL/XML标准 (1)XMLELEMENT和MLATTRIBUTES函数。 这两个函数分别生成XML文档的基本构成要素:元素和属性。
11.8SQL/XML标准11.8.1发布XML文档
XMLELEMENT函数的基本格式为: XMLELEMENT(Name"<tagname>", [attributeList],<content>) 其中,Name是保留字,tagname是标签的名字,attributeList是一组属性名和值,由XMLATTRIBUTES函数生成,content是元素的内容,既可以是字符串,也可以是一组子元素。 XMLATTRIBUTES函数的格式更为简练,只有一个参数,例如,S.SnoAS"Sno",引号内的Sno是属性的名字,S.Sno提供了属性的值。11.8SQL/XML标准11.8.1发布XML文档(2)XMLGEN函数 XMLGEN函数与XMLELEMENT函数的功能相似,但是XMLGEN函数更简洁。它的第一个参数是XML文档模板,模板中有形如{$name}的占位符,其它的参数用于替换占位符。11.8SQL/XML标准11.8.1发布XML文档(3)XMLFOREST函数
XMLFOREST函数把每个参数转换成一个XML元素。默认情况下,列名就是元素的名称,也可以用AS短语为元素命名。(4)XMLCOMMENT函数
XMLCOMMENT函数产生一条注释。11.8SQL/XML标准11.8.1发布XML文档(5)XMLPI函数
XMLPI函数用于生成处理指令。(6)XMLNAMESPACES函数
XMLPI函数用于生成命名空间。(7)XMLAGG函数
XMLAGG函数处理同一个分组中的每个元组。11.8SQL/XML标准11.8.1发布XML文档2、SQLServer2005中的发布方法 在SQLServer中,获得一个XML类型结果集的最简单的方法就是使用FORXML命令
FORXML命令的语法如下所示:
[FOR{BROWSE|<XML>}]11.8SQL/XML标准11.8.1发布XML文档其中,XML的定义如下:<XML>::=XML{{RAW[('ElementName')]|AUTO}[<CommonDirectives>[,{XMLDATA|XMLSCHEMA[(TargetNameSpaceURI)]}][,ELEMENTS[XSINIL|ABSENT]]11.8SQL/XML标准11.8.1发布XML文档|EXPLICIT[<CommonDirectives>[,XMLDATA]]|PATH[('ElementName')][<CommonDirectives>[,ELEMENTS[XSINIL|ABSENT]]]}11.8SQL/XML标准11.8.1发布XML文档其中主要的参数如表11.1所示
11.8SQL/XML标准表11.1主要的参数参数名称含义RAW[('ElementName')]生成XML文档时,将查询所得数据集中的每行记录作为一个元素,且元素的名称为ElementNameAUTO查询结果将以XML的层次结构返回给用户,其中查询结果中至少有一个字段将被指定为元素,而其它字段可能会被指定为属性XMLDATA返回XMLSchema类型的XML文档EXPLICIT为返回的结果集显式地指定层次关系PATH借助PATH参数,可以通过设计嵌套的FORXML查询来组织元素和属性,例如设置用于表示复杂属性的嵌套方式等ROOT用于指定根元素11.8.1发布XML文档(1)FORXMLRAW RAW模式将查询结果集中的每一行转换为带有通用标识符<row>或用户提供的元素名称的XML元素。默认情况下,行集中非NULL的列值都将映射为<row>元素的一个属性。11.8SQL/XML标准[例13]查询所有学生的信息,用XML形式返回。代码如下: SELECTSno,Sname,Ssex,Sage,SdeptFROMStudentFORXMLRAW11.8SQL/XML标准产生如下结果:<rowSno="2000012"Sname="王林"Ssex="男" Sage="19"Sdept="计算机"/><rowSno="2000113"Sname="张大民"Ssex="男" Sage="18"Sdept="管理"/><rowSno="2000256"Sname="顾芳"Ssex="女" Sage="19"Sdept="管理"/><rowSno="2000278"Sname="姜凡"Ssex="男" Sage="19"Sdept="管理"/><rowSno="2000014"Sname="葛波"Ssex="女" Sage="18"Sdept="计算机"/>11.8SQL/XML标准(2)FORXMLAUTO
如果在将查询结果集转换为XML文档时,使用了AUTO关键字,那么查询结果集将以层次结构的形式组织起来。 选择所有学生的信息,用XML形式返回。代码入下: SELECTSno,Sname,Ssex,Sage,Sdept FROMStudent FORXMLAUTO
11.8SQL/XML标准结果如下:<StudentSno="2000012"Sname="王林" Ssex="男"Sage="19"Sdept="计算机"/><StudentSno="2000113"Sname="张大民" Ssex="男"Sage="18"Sdept="管理"/><StudentSno="2000256"Sname="顾芳" Ssex="女"Sage="19"Sdept="管理"/><StudentSno="2000278"Sname="姜凡" Ssex="男"Sage="19"Sdept="管理"/><StudentSno="2000014"Sname="葛波" Ssex="女"Sage="18"Sdept="计算机"/>11.8SQL/XML标准(3)FORXMLEXPLICIT
使用FORXMLEXPLICIT选项后,查询结果集将被转换为XML文档。该XML文档的结构与结果集中的结果一致。因此,从设计查询语句时就应开始考虑最终生成的XML文档。 在EXPLICIT模式中,SELECT语句中的前两个字段必须分别命名为TAG和PARENT。TAG和PARENT是元数据字段,使用它们可以确定查询结果集的XML文档中元素的父子关系,即嵌套关系。11.8SQL/XML标准 其中TAG字段是查询字段列表中的第一个字段。TAG字段用于存储当前元素的标记值。标记号可以使用的值是1到255。 PARENT字段用于存储当前元素的父元素标记号。如果这一列中的值是0或NULL表明相应的元素没有父级。该元素将作为顶级元素添加到XML。 在添加上述两个附加字段后,就要定义元素之间的关系,即层次关系。11.8SQL/XML标准 对于层次关系,只需按顺序完成以下步骤即可:1、使用TAG字段为每一个将要作为元素在XML文档中输出的别名(通常可以使用表名)定义标号。2、使用PARENT字段为本元素指定一个父元素标号,与该标号对应的元素,将成为本元素的父元素(NULL或0表示本元素为根元素)。 重复上面的步骤就可以产生想要的XML文档。11.8SQL/XML标准 在编写EXPLICIT模式查询时,常用格式如下:ElementName!TagNumber!AttributeName!Directive 其中ElementName是所生成元素的通用标识符。例如,如果将ElementName指定为Student,将生成<Student>元素。 TagNumber是分配给元素的唯一标记值。在两个元数据列(Tag和Parent)的帮助下,此值将确定所得到的XML中的元素的嵌套。 AttributeName提供要在指定的ElementName中构造的属性的名称。 Directive是可选的,可以使用它来提供有关XML构造的其它信息。11.8SQL/XML标准 例如查询所有学生的信息,并且把每列作为一个元素,代码如下:SELECT1ASTag,0ASParent,Snoas[Student!1!Sno!ELEMENT],SnameAS[Student!1!Sname!ELEMENT],SsexAS[Student!1!Ssex!ELEMENT],SageAS[Student!1!Sage!ELEMENT],Sdeptas[Student!1!Sdept!ELEMENT]FROMStudentFORXMLEXPLICIT11.8SQL/XML标准产生的部分结果如下:<Student> <Sno>2000012</Sno> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>计算机</Sdept></Student>……11.8SQL/XML标准11.8.1发布XML文档(4)FORXMLPATH
除选项EXPLICIT之外,SQLServer2005还提供了一种较为简便的方法来定义元素之间的层次关系,即FORXMLPATH选项。PATH选项使用嵌套的FORXML查询有机地将元素和属性组合在一起。
11.8SQL/XML标准1、没有名称的列 任何没有名称的列都将被内联。例如,未指定列别名的计算列或嵌套标量查询将生成没有名称的列。如果该列属于XML类型,则将插入该数据类型的实例的内容。否则,列内容将被作为文本节点插入。 例如: SELECT10+10 FORXMLPATH 结果为: <row>20</row>11.8SQL/XML标准例如上面的代码可以改为: SELECT10+10 FORXMLPATH('Number')结果为: <Number>20</Number>11.8SQL/XML标准 PATH模式将插入一个XML类型的实例。 SELECT Sno,Sname,PhoneList.query('//Phone[ @type="home"]') FROMStudent FORXMLPATH 产生结果如下: <row> <Sno>2000012</Sno> <Sname>王林</Sname> <Phonetype="home">87654321</Phone> </row>11.8SQL/XML标准2、列名以@符号开头
如果列名以@符号开头并且不包含斜杠标记(/),将创建包含相应列值的<row>元素的属性。例如,以下查询将返回包含两列(@Id和Sname)的行集。在生成的XML中,将向相应的<row>元素添加Id属性并为其分配Sno值。11.8SQL/XML标准SELECTSnoAS"@Id",Sname FROMStudent WHERESno='2000012' FORXMLPATH('Student')产生的部分结果如下:<StudentId="2000012"> <Sname>王林</Sname> </Student> <StudentId="2000113"> <Sname>张大民</Sname></Student>……11.8SQL/XML标准3、列名不以@符号开头并包含斜杠标记(/) 如果列名不以@符号开头,但包含斜杠标记(/),则该列名就指明了一个XML层次结构。例如,列名为“Name1/Name2/Name3.../Namen”,其中每个Namei表示嵌套在当前行元素(i=1)中的元素名称或名为Namei-1的元素下的元素名称。如果Namen以@开头,则它将映射到Namen-1元素的属性。11.8SQL/XML标准例如查询所有学生的信息。代码如下:SELECTSno"@Id", Sname"Student/Sname", Ssex"Student/Ssex", Sage"Student/Sage", Sdept"Student/Sdept"FROMStudentFORXMLPATH('StudentList')11.8SQL/XML标准产生的部分结果如下:<StudentListId="2000012"> <Student> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>计算机</Sdept> </Student></StudentList>……11.8SQL/XML标准4、名称被指定为通配符的列 如果指定的列名是一个通配符(*),则将像没有指定列名那样插入此列的内容。如果此列不是XML类型的列,则此列的内容将作为文本节点插入,如下所示 SELECTSno"@Id",Sname"*" FROMStudent FORXMLPATH('Student')11.8SQL/XML标准结果如下:<StudentId="2000012">王林</Student><StudentId="2000113">张大民</Student><StudentId="2000256">顾芳</Student><StudentId="2000278">姜凡</Student><StudentId="2000014">葛波</Student>11.8SQL/XML标准11.8.2存储和查询XML文档(1)XML数据类型 以下给出了XML数据类型可以使用的方式
1.作为表中的一列
2.作为T-SQL的变量
3.作为存储过程或者是用户自定义函数的参数
4.作为用户自定义函数的返回值11.8SQL/XML标准 在Student表中增加一个列PhoneList,用于存放一个学生的各种联系电话,这些联系电话被组织成XML文档。 CREATETABLEStudent( Sno CHAR(7)PRIMARYKEY, Sname CHAR(8)NOTNULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20), PhoneList XML);11.8SQL/XML标准例如,向表中插入一个学生的信息:INSERTINTOStudentVALUES('2000012','王林','男',19,'计算机','<PhoneList><Phonetype="home">12345678</Phone><Phonetype="apartment">xxxxxxxx</Phone><Phonetype="mobile">133xxxxxxxx</Phone><Phonetype="mobile">139xxxxxxxx</Phone></PhoneList>');11.8SQL/XML标准11.8.2存储和查询XML文档(2)查询
SQLServer提供了若干函数对XML数据类型的列进行操纵,与查询相关的有三个函数,query()、value()和exist()。
Query()方法用于查询XML实例中满足一定条件的节点。11.8SQL/XML标准11.8.2存储和查询XML文档(2)查询 value()方法用于读取节点的值,并转换为指定的SQL数据类型。其格式为:value(XQuery,SQLType)。 其中,XQuery参数是XQuery表达式,表达式的结果最多包含一个节点,否则将发生错误。SQLType是SQL的数据类型。
11.8SQL/XML标准11.8.2存储和查询XML文档(2)查询 exist()方法用于判断查询结果是否是空集合,根据查询结果的不同,函数有3种返回值: 0:查询结果为空集合 1:查询结果至少包含了一个XML节点 NULL:执行查询的XML数据类型实例包含 NULL 其格式为:exist(XQuery)`11.8SQL/XML标准[例14]
查询学生2000012的全部电话信息SELECTPhoneListFROMStudentWHERESno='2000012'11.8SQL/XML标准 PhoneList列的数据类型是XML,查询结果是一个XML文档。<PhoneList><Phonetype="home">12345678</Phone><Phonetype="apartment">xxxxxxxx</Phone><Phonetype="mobile">133xxxxxxxx</Phone><Phonetype="mobile">139xxxxxxxx</Phone></PhoneList>11.8SQL/XML标准[例15]
查询学生2000012的家庭电话SELECTPhoneList.query('//Phone[@type="home"]')FROMStudentWHERESno='2000012';Query()方法返回的是节点的集合,因此,查询结果为:<Phonetype="home">12345678</Phone>11.8SQL/XML标准[例16]
查询年学生2000012的家庭电话号码。SELECTPhoneList.value('(//Phone[@type="mobile"]/text())[1]','varchar(20)')FROMStudentWHERESno='2000012';由于路径表达式//Phone[@type="mobile"]/text()可能返回多个文本节点,而value函数要求最多只能是一个节点,因此,增加了限制条件[1]。查询结果是133xxxxxxxx11.8SQL/XML标准[例17]
查询家庭电话号码是12345678的学生的姓名SELECTSnameFROMStudentWHEREPhoneList.value('(//Phone[@type="home"]/text())[1]','varchar(20)')='12345678'11.8SQL/XML标准11.8.2存储和查询XML文档(3)XMLDML XQuery1.0规范没有定义修改XML文档的语法,目前正在开发相关的工作草案。SQLSever2005提供了modify函数用于修改XML文档的,其语法类似于XQuery。modify函数可以删除、增加、替换文档中的节点。11.8SQL/XML标准1.modify('deleteexpression') expression是一个Xpath表达式,返回一个节点序列,delete命令表示从文档中删除节点序列中的所有节点。[例18]
删除学生王林的所有移动电话。UPDATEStudentSETPhoneList.modify('delete//Phone[@type="mobile"]')WHERESname='王林';11.8SQL/XML标准语句执行后,王林的通讯录中只有两部电话(home和apartment两个电话号码):<PhoneList><Phonetype="home">12345678</Phone><Phonetype="apartment">xxxxxxxx</Phone></PhoneList>11.8SQL/XML标准2.modify('insertexpression') insert语句将一个节点或者一个有序的序列插入XML文档,这些新插入的节点作为某个节点的孩子或者兄弟节点。 Insert语句的一般格式如下: InsertExpression1({asfirst|aslast}into|after|before}Expression2)11.8SQL/XML标准 其中,Expression1是要插入的节点或序列,Expression2是要插入的目
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年矿产品代理销售合同
- 2024年数据中心装修工程合同
- 2024年版房地产代理合作协议
- 2024年户外广告牌及宣传栏卫生保洁托管服务合同3篇
- 简单机器人课程设计
- 2024年标准版小商品买卖协议模板版B版
- 2024年标准商铺销售协议版B版
- 渔业捕捞自动化控制系统考核试卷
- 涤纶纤维在防潮地板材料中的应用考核试卷
- 电玩具国内外专利法规解读考核试卷
- 2023-2024学年河南省洛阳市洛龙区数学四年级第一学期期末预测试题含答案
- 项目管理绩效考核管理办法
- 冀教版九年级下英语单词表(汉译英)
- 亚马逊跨境电商运营与广告实战
- 高级FAE现场应用工程师工作计划工作总结述职报告
- 落实国家组织药品集中采购使用检测和应急预案
- 高标准农田建设项目(二标段)施工图设计说明
- 猪场配怀工作安排方案设计
- GB/T 2-2016紧固件外螺纹零件末端
- GB/T 12467.5-2009金属材料熔焊质量要求第5部分:满足质量要求应依据的标准文件
- 安全生产事故举报奖励制度
评论
0/150
提交评论