• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

这是一个有关以数据为中心的I n t e r n e t的一个重要的考虑。
所以,假使我们想使用X P a t h来进行查询,我们应如何正确地进行呢?最好和最有效的解决
方案是,实际地编写一些将X P a t h的查询转化为针对下面的数据库的正确形式的查询。实现的细
节将依赖于不同的数据库系统,但是我们将举例说明一些后面例子中的一些观点。
现在,我们将使用一个相当简单的方法,用这个方法装入作者列表到XML DOM(文档数据
模型,Document Object Model)中去,并且接着使用X S L来选择节点。然后我们会得到可以改
变后端数据库的好处,同时查询保持不变。让我们修改一下脚本,替换S E L E C T查询中所传递的
W H E R E部分,我们像这样传递一个X P a t h语法的查询:
(1) 使用D O M来写X M L
我们需要做的第一件事就是修改脚本来存储从数据库取回的信息到一个XML DOM。我们应
该真正地在做其他事之前完成它,但是对于某些文档,像我们所产生的那个,非常快和容易,
只需要用脚本嵌入一些标记的名字。然而,使用D O M则要确保所有的标记是匹配的,所有的属
性都用双引号括起来,并且所有的命名空间都是正确的。我们甚至可以用一个解析器来验证节
点树,在我们将结果发回给调用者或传输结果之前,来确认结果是正确的。
在声明完变量之后,是创建一个D O M,用来保存结果(注意I E 5将需要安装I I S来运行这个
特殊的脚本,尽管你可以容易地使用所选的解析器来修改脚本):
程序清单1 0 - 1 6
这个对象提供给我们处理所有D O M的特性(查看第5章,关于可用特性的全部讨论)。接着,
我们在数据库上运行查询用来检索所有的作者:
程序清单1 0 - 1 7
这段代码同样能够正确地建立起结果集。然而在能够写出标记之前,这一次将使用D O M。
382使用XML 高级编程
下载
第一步是创建一个叫做< A u t h o r s >的元素,它将用来保存所有的作者:
如你所见,创建这个元素比起在开始和结尾写出< A u t h o r s >和< / A u t h o r s >还要容易,因为
D O M保证了这个层次将被正确地维护。现在准备开始循环处理数据。每一次,从数据库中得到
一条记录,我们需要在D O M中创建一条新的元素,这一次叫< A u t h o r >:
请注意,对于使用D O M的新手常犯的一个错误是假设刚才所创建的节点与某个东西相连;
不是这样的!尽管你不得不通过解析器对象来调用元素的生成函数,节点是完全自由地浮动的。
当它已经被完全配置好了在循环的末尾,我们将把它附接给< A u t h o r >节点。
处理< A u t h o r >元素的第一件事就是设置它的a u t h o r C i t e I D属性。注意,如果在数据库中的值
为N U L L,s e t A t t r i b u t e ( )函数将会失败。所以,一般情况下我们将首先检查N U L L。然而,在这
种情况下,我们知道因为它是表的主键,它的值将总是存在的:
在记录中接着的四个字段被在X M L文档中的元素所表示。为了向< A u t h o r >节点加入元素容
易些,我们增加了一个叫做F i e l d To E l e m e n t ( )的函数,细节如下:
程序清单1 0 - 1 8
在数据库中的P o r t r a i t字段对应一个叫做p i c L i n k的属性,在一个叫< P o r t r a i t >的空元素中。不
像a u t h o r C i t e I D属性,我们需要检查数据库的值是否是N U L L,因为如果是,它将跳出循环。如
果是N U L L,我们将不厌其烦地创建< P o r t r a i t >元素:
程序清单1 0 - 1 9
在完成循环进到下一条记录之前,我们将< A u t h o r >节点追加到< A u t h o r s >节点上:
程序清单1 0 - 2 0
第10章XML和数据库使用383 下载
一旦完成增加新的节点到< A u t h o r s >节点,可以拷贝所建立的节点列表到我们在前面创建的
解析器对象的X M L文档容器中。我们需要这么做,因为在这个地方o A u t h o r s对象只是一个包含
一组节点的节点,不是一个完整的X M L文档:
一旦我们创建了D O M,需要把它发送给浏览器。用必要的信息放在它的前面来显示它是一
个X M L文档,然后使用D O M的x m l属性来编写它的内部结构的文本化的信息。D O M考虑了开和
关标记,将属性用引号引起来等等:
程序清单1 0 - 2 1
最后是一个在前面我们提到过的一个函数,它是用来简化从记录集的字段中创建节点,和
把它们加入到另一个节点中。同时在使用p i c L i n k属性的时候,不用担心当数据库中的值是
N U L L时会创建任何东西。如果数据集很大,这件事就很值得做,因为可能会存在许多空元素,
它们占用空间。然而,应该只有在知道文档的D T D允许当元素为空可以不存在时我们才这样去
做。在这种情况下它将是:
程序清单1 0 - 2 2
(2) 增加查询
我们刚写的代码只是简单地以X M L的形式输出所有的作者,但是使用D O M要好于写自己的
标记。换句话说,我们不应该增加额外的功能到已经有的东西上。然而,既然数据在D O M中,
可以用它来做任何我们想处理X M L的事情。特别是,可以增加自己的X S L查询语句。
附加的代码被突出显示,而且它位于将数据库中的数据转换为D O M的代码之后。只有那时
我们才可以使用X S L语句:
程序清单1 0 - 2 3
384使用XML 高级编程
下载
如果没有查询被传给调用者,则返回整个结果集。然而,如果存在一个查询,我们使用
s e l e c t N o d e s语句来进行过滤。s e l e c t N o d e s语句可以用在任意节点上,所以我们可以这么写:
然而,因为所建立的< A u t h o r s >节点不是一个正确的X M L文档,它没有根节点,并且查询开
始用一个/—意味着从根开始工作—结束时不会返回任何东西。所以查询事先创建的D O M对
象的文档元素,我们将< A u t h o r s >节点保存在里面。
(3) 输出结果
用X S L选择的节点的结果不必是一个有效的X M L文档。例如,X S L查询:
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(126)