账号:
密码:
最新动态
产业快讯
CTIMES / 文章 /
XML的查询语言
 

【作者: 葉建華】2000年06月01日 星期四

浏览人次:【13649】

前言

在上期中,我们介绍了XML服务器的架构,包括架构的说明,架构中各组件所担负的任务,以及运作的流程等等。在这一期中,我们要介绍的是在XML数据上所使用的查询语言。当XML成为数据交换的标准之后,XML的数据数量将会大量增加,届时对XML查询的需求将会不可或缺。本文就针对XML上所使用的查询语言,也就是XQL,为各位做一个完整的介绍。


为什么要查询XML?

这个问题很简单,由于我们在前一期探讨过XML服务器的架构,因此可以想见的是,XML文件一旦用一个伺服架构来进行管理之后,就会遇到传统上数据库的共通问题,也就是所谓的数据库查询标准。在过去,我们对于关系数据库或是面向对象数据库的查询处理,都是透过一个结构化的查询语言来进行,也就是SQL或是OQL(Object Query Language),这种查询语言允许你针对特定的数据表或是对象树进行查询操作,并允许你以特定的过滤标准来筛选数据。而在文档库的查询上,则是采用了非结构性的查询标准,也就是我们所熟知的全文检索,这种查询方法完全不去限定特定的数据范围,并利用特殊的索引方法来加速查询的处理,如反向索引(inverted index)或是特征档案(signature file)等等。而对于XML这种特殊结构的数据文件型态,则必须发展出另一种查询的方法,因为其特性的关系,传统的查询处理已不再适用。以下我们就针对XML的特性,来介绍XML上的查询标准。


XML上的查询标准:XQL

所谓XML文件,就是一种结构化的文件,它将数据(data)与文件(document)之间的界线拉近并使之模糊,也就是允许将文件当程序数据的来源端,同时传统的数据源端也被当成式文件型态来进行处理。有部分的XML文件相当简单,就如同传统数据库的文字数据而已,但有部分的XML中则包含了关系型表格所无法处理的数据结构。在我们传统上会处理的数据,有时也可以透过XML来发挥其影响力。举例来说,医院的医疗纪录在经过XML标记之后,就可以当成相当有用的数据源端,它可以提供各种不同型态的医疗数据,包括病历、诊断、处方、以及帐款等等。


当有越来越多的数据是以XML文件的型态储存时,以XML来交换数据、呈现多样性数据的用途就会陆续出现。因此,不可避免地就会遇到下一个问题:要有一个有效的处理机制,用来查询XML的数据源端,也就是说,当XML成为一个通用的交换标准之后,就需要有一个通用的查询标准来存取相关的数据。使用XML的查询,将有助于在大量的数据集中依照不同的标准,来进行数据的筛选以及逻辑观点(view)的建立。因此,在XML上的查询标准,我们就以XQL(XML Query Language)来称呼它。


XQL是设计用来处理一般性的XML数据,而在设计的过程中,XML的相关需求则是由四个主要的需求领域(problem domain)来决定。这些需求领域列举如下:


1. 在单一XML文件中的查询需求(如XML浏览器或是XML编辑器中)。


2. 在文件集之中的查询需求(如XML文件所形成的数据储存端)。


3. 文件之中的链接,以及文件之中的链接(如XLI和XPointers)。


4. XSL样式的查询需求。


以上这四个需求领域,都各具特色,而领域之间的相似性也相当的低。同时在这里所谓的查询也和传统我们对查询的定义有所不同。例如XPointers是针对特定文件指定某个定点,而XSL则是用来处理XML文件的特定元素(element)。由于特性差异甚大,传统上使用SGML以及XML的开发者都会将这些领域分开处理。即使在这些领域之间有着很大的差异性,但这些处理工作上也存在着一定的共通性。也就是说,在处理上对不同领域的处理方法自然不同,但在其中查询层次的需求却是相当地类似。


这点对应回传统的SQL之于关系数据库上,有着相当类似的特性。SQL在关系数据库上的用途相当地多,也相当的不同,如建立数据观点,执行查询,指定数据记录等等。即便如此,在其上运作的查询语言,也就是SQL,却是相同的。因此,即使在XML的需求领域上有着不同的差异,其上的查询语言,也就是XQL,是可以以相同的设计概念来进行。接下来,我们就针对这些不同的需求领域,来探讨这些领域的需求,并透过这些需求来进行一个多用途查询语言的设计。


1.在单一XML文件中的查询:

这种查询对于在XML浏览器或是XML编辑器中的文件特别有用,这样的查询允许用户查询一个大型的文件,却不需要上下卷动来找寻所需要的相关数据。此外,文件的作者也可以利用这样的查询来建立对文件的不同观点,如此一来,便可以针对不同知识背景的用户,为其建立适合用户阅览的文件内容,甚至可以利用这样的方法,来限制不同权限用户可以阅览的内容范围。在这样的需求领域下,所谓的数据输入端,就是一个完整的XML文件,而对这个文件的加载处理上,可以相当的简单,也可以相当的复杂。


简单的处理方式就是加载整份文件到内存中,但是复杂的处理方式则包括考虑内存的使用量,或是只加载部份的文件内容,甚或是针对文件建立索引等等。而查询处理后的结果则有着各种不同的表现形式。例如,查询结果可以是针对文件中特定节点的列举列表,或是一个可以显示文件特定位置的列表,甚至可以是一个动态建立并可供浏览的树状结构。虽然查询结果可能有着很大的不同,但对查询语言的角色来说,都是不变的,也就是说,查询的目的都是要取出一个集合的节点,至于表现的形式则是另一个步骤。至于查询所得到的数据,应该包含以下几种:


A. 元素(element)或是属性(attribute)的名称。


B. 节点的型态(如元素、属性、处理指令,以及位置等等)。


C. 节点的内容或其数据值。


D. 节点与节点之间的关系,包括阶层、顺序,以及位置等等。


在文件集之中的查询:这种查询的用途相当广泛,包括由文件所组成的XML文件储存端,抑或是单一或是跨网站的查询,甚至是数据发掘(data mining)。这样的查询是以一个XML文件集或是多个文件之中的节点集合为基础。而其查询结果的输出,则可以和查询单一文件的输出相同。


2.文件之中以及文件之间的链接:

这种查询特别是用来处理文件中使用超链接所指定的地址,曾使用过浏览器的人都知道,HTML中所提供的超链接就是将特定的文件以URL名称来表示,以达到利用文件的锚点(anchor)来直接链接标的文件的目的,而标的文件的名称就是以属性的型态来予以定义。一个单一的Web文件可以包括指向别处的文件链接,也可已是文件本身其他位置的链接。而在XML以及SGML的世界里,长久以来就有比这样的链接型态还要复杂的特性,包括TEI链接、HyTime链接,以及XML的链接。这些链接都允许更大弹性的链接型态,其中包括:


A. 指定文件中的任何节点,而不须对节点做任何的指定与更改。


B. 对已知的文件位置指定相对路径。


C. 在一个文件树中指定绝对路径。


3.XSL样式:

由于XSL样式适用来指定文件中结构树与其他结构树之间的转换对应关系,所以这样的查询比起前三种查询来说,又有着截然不同的形式。在这样的转换过程中,我们会看到一个相当重要的环节,就是根据个别节点的属性以及其相关节点的属性来作测试,因此对于节点查询的需求就显现于此。对XSL的转换来说,输出的结果是另一个树状结构的数据,而转换的过程则是根据XSL中所定义的样板规则来决定。因此,由XSL样式所指定对节点的测试来看,和我们先前所提对文件查询的标准是相同的,列举如下:


A. 元素(element)或是属性(attribute)的名称。


B. 节点的型态(如元素、属性、处理指令,以及位置等等)。


C. 节点的内容或其数据值。


D. 节点与节点之间的关系,包括阶层、顺序,以及位置等等。


由上面四点来看,XQL查询的需求领域的确有相当的差异,其中包括输入、输出、处理模型、以及处理结果的输出形式等等。但无论如何,它们都有一个相同点,就是它们都必须根据某些特定的宣告来指定一个或多个节点,这样的宣告包括节点名称、内容、内含值、以及和其他节点之间的关连。而XQL正提供了指定这些特定宣告的途径。又由于XQL并不去指定所需要的输入格式、输出格式、以及处理模型,因此它对于这几的查询形式存在:个需求领域来说,是完全中性的。这也就是为什么XQL可以像传统的SQL角色如此重要一般。


XQL的使用环境

当我们检视过XQL的需求领域之后,接下来我们就来看看可能使用到XQL的几种环境。由于Web环境相当的普及,因此我们也必须让XQL这样的查询语言可以在多样性的Web环境中使用,因此我们先将几种可能的使用环境归纳如下:


1.以命令行的查询形式存在:

这种单纯的查询字符串是所有XQL查询最基本的表示形式。它可以由命令行直接下达,也可以透过图形化的查询界面来产生,甚至可以放在程序中来执行。举例来说,以下是一个查出author元素中所有front元素的XQL查询:


author/front


这样的查询会将所有的author元素予以检视,而检视的标准则在于是否有front元素的存在,如果有的话,则将符合的元素以结构树的方式传回。


2.在程序语言中指定:

在一个程序语言中,XQL可以被指定成字符串形式,并当成一种可执行的查询。举例来说,以下是一个以Java字符串形式存在的XQL查询:


String qstring = "front/author";


3.以URL的形式存在:

XQL查询不但可以由以上的形式存在,同时也可以成为URL的一部份,用以提供更仔细过滤后的文件。举例来说,以下便是一个包含XQL查询的URL:


http://www.example.com.tw/documents#front/author


4.以HTML或XML中的属性存在:

XQL查询也可以在HTML或是XML文件中存在,其形式就是以属性值(attribute)的形式表示,如下所示︰


<a href=* http://www.example.com.tw/documents#front/author">


XQL查询的内涵

要了解XQL查询的内涵,我们可以藉由和传统的SQL语言比较,来一窥究竟。比较的层面可以分为四个主要的部份:由数据储存的角度来看(也就是数据库)、由查询语言的角度来看、由查询的输入端来看、以及由查询的结果来看。而其比较的结果则由下表来表示:


如果要更清楚地了解这些概念,我们可以透过一个最简单的范例来检视所谓的搜寻主体(数据)、查询、以及查询的结果。在下例中,我们透过查询novel元素,来针对搜寻主体进行处理:


以上的例子相当简单,只是一个单一节点的范例,往后我们还会有更复杂的数据与查询范例供读者参考。


查询结果的形式

在(表一)中,我们可以清楚的知道,SQL的查询结果是由一个表格的记录所形成的,这也就是说,SQL查询的结果会是一个原表格数据的子集合,并由一笔一笔选出的字段记录所构成。那么,XQL查询的结果呢?在上例中(图一),我们知道XQL查询所产生的结果也是以一个XML文件结构存在的形式。为什么是以这样的形式存在呢?在以下的叙述中,我将会发现,在许多不同的使用环境中,XQL的结果大多是以XML文件的形式存在最为恰当,理由如下:



《表一 SQL与XQL特性的比较表》
《表一 SQL与XQL特性的比较表》

《图一 一个简单的查询范例》
《图一 一个简单的查询范例》

1. XML文件可以很轻易的使用一个标准的XML parser来予以解析,因此XQL查询所产生的XML文件以ASCII 数据流来传递是在简单也不过的事情了。


2. XML文件可以在一个支持XML的浏览器中呈现,因此呈现部份的工作不需要由应用程序来负担。


3. XML文件可以很轻易的存放在XML储存端中,请参考上期中我们所介绍的XML服务器架构,一旦有了这样的伺服架构,我们就不必再去费心构思XQL查询结果的储存问题。


4. XML文件可以透过XSL处理器的处理来作某些形式的转换,以提供多样性的呈现,或是不同应用程序之间的数据交换用途。


在(图一)中,我们所看到的查询结果,仅是一个单一节点所形成的XML文件,但是如果XQL查询包含了一个以上的节点的话,要维持一个结构良好的XML文件(也就是只允许单一根节点存在的XML文件)结构,就必须要做一些必要的加工。针对这样的问题,我们可以用以下的例子来解释。在下面的XQL查询中,我们使用了一个 “*” 的查询运算符号,这种查询运算是要取出所有符合的元素,而不管元素的名称为何。而 “/” 符号则代表了节点之间的直接从属关系(parent/child),请见(图二):



《图二 一个进阶的查询范例》
《图二 一个进阶的查询范例》

后记

本文说明了XQL的设计精神,以及XQL在许多方面的设计考虑。在下一期中,我们将会深入介绍XQL的语法,以及各种XQL语法的用途与相关的范例。


相关文章
线下服务应用与HTML规范发展
SOAP - 让程式畅行于网路间
打造Web行动应用系统平台
数位家庭之互通关键 - UPnP应用分析
网页发展的未来 – XHTML 2.0
comments powered by Disqus
相关讨论
  相关新闻
» 宜鼎独创MIPI over Type-C解决方案突破技术局限,改写嵌入式相机模组市场样貌
» 鼎新电脑串连生态系夥伴 数智驱动智慧低碳未来制造
» 鼎新电脑携手和泰丰田解缺工 以数位劳动力开启储运新时代
» Fortinet SASE台湾网路连接点今年落成 全台巡??落实云地零信任资安
» Ansys模拟分析解决方案 获现代汽车认证为首选供应商


刊登廣告 新聞信箱 读者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 远播信息股份有限公司版权所有 Powered by O3  v3.20.1.HK84P30EIMSSTACUK8
地址:台北数位产业园区(digiBlock Taipei) 103台北市大同区承德路三段287-2号A栋204室
电话 (02)2585-5526 #0 转接至总机 /  E-Mail: webmaster@ctimes.com.tw