• 热门标签

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

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

将返回下面的节点:
作为一个X M L文档它是无效的,因为没有根节点—或一个以上的根节点,看你是怎么看
了!
然而,我们可以像以前一样简单地用一个< A u t h o r s >节点包装每件东西,因为结果不一定是
作者。以前的查询用< A u t h o r s >包装后看上去将是:
程序清单1 0 - 2 4
它将打乱我们的D T D或模式,因为< L a s t N a m e >只能作为< A u t h o r >的子节点而不是
< A u t h o r s >的。当然可以说结果只能返回作者,并且只能将结果放在一个< A u t h o r s >元素里,但
是这将极大地降低了脚本的灵活性。例如,如果有人想列出在数据库中所有图片的引用列表,
那样他们就可以创建一个肖像长廊,他们可能使用如下的查询:
这个查询要求我们的服务器查找所有的< 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 >元素的子元素,
< A u t h o r >元素必须是< A u t h o r s >元素的子元素。那个查询可能返回下面的结果:
程序清单1 0 - 2 5
第10章XML和数据库使用385 下载
如果不将它包装在< A u t h o r s >里,并且不能仅仅创建像希望中的新的如< L a s t N a m e >和
< P o r t r a i t s >这样的包含元素(因为它们也会校验失败),然后可能会考虑用一般的元素来进行包
装。例如,可以设计自己的包容器,并且也许在它的里面包括对到达的信息应如何返回的信息:
程序清单1 0 - 2 6
甚至可以更进一步,加入时间戳和其他的信息,用来辅助处理查询结果。在下一部分,我
们将简要地看一下关于一些包装数据的方法。现在只能返回所要求的数据—例如,可能有多
于一个的元素在文档的根。让我们完成脚本,把X S L查询结果写出来:
程序清单1 0 - 2 7
注意这次使用了循环。因为可能有一些顶级的节点,需要在结果节点列表中循环,为每一
个节点输出X M L,要好于简单地把整棵树输出成为X M L。
3. 优化
在前面所勾勒出的技术相当低效。在发觉只想要其中的一个之前,它要求我们读出所有的
作者。在我们这个简单的例子中,它不是一个很大的处理,但是在一个有着成千上万记录的数
据库中可能会很慢。
为了提高效率,应该利用其下的数据库的查询能力,并且使用X S LT和X P a t h的能力来合并
它们。假设想主要考查关系数据库,我们将快速地看一下X P a t h语句是如何被映射成S Q L语句。
例如:
要求所有叫M I的作者。这个可以直接被映射为:
选择一个单个的作者应该是:
将被映射成:
X P a t h也允许根据树中其他部分的节点的值来选择节点。例如,使用第7章的书目录模式,
386使用XML 高级编程
下载
如果你想选择所有的书,这些书与一个特别的出版商相关联,则需要下面的X P a t h查询:
这个意思是说,我们需要所有的< B o o k >元素,把它的i m p r i n t / @ I D设成与< P u b l i s h e r >的
< C o r p o r a t e N a m e >为“ Wrox Press Ltd. ” 下的< I m p r i n t s >元素下的< I m p r i n t >元素的
s h o r t I m p r i n t N a m e属性一样的值。
在S Q L中模拟分级的语句是很直接的。我们可以使用简单地连接语句来得到父/子关系,所
以/ C a t a l o g / B o o k将变成:
请求的指定出版商的查询部分为:
也不是很困难:
程序清单1 0 - 2 8
(假设我们知道文本元素< C o r p o r a t e N a m e >已经被存在一列而不是表中了。我们可以在后面
看到。)
在C a t a l o g / B o o k上的过滤很困难。为了做到这一点,我们需要介绍关于S E L E C T语句的另一
个方面—子查询。子查询允许查询结果被用作值的列表用于检查另一个查询。在我们的例子
中,想创建一个所有s h o r t I m p r i n t N a m e值的列表,并且查看哪一个与i m p r i n t元素的I D这个值相匹
配,在使用那个列表查找引用i m p r i n t的书之前。我们可以如下实现:
程序清单1 0 - 2 9
请注意,我已经方便地优化了在以前建立的用来只选择一个出版商的其他过滤器。然而,
我确信你可以看出,用S Q L查询来模拟X P a t h查询是可能的。但是存在两个问题。第一个就是
X P a t h仍然不是一个标准,所以现在你所写的可能会改变。第二个就是你需要分析X P a t h语句,
并且能够理解整个语法。这些问题如何被完全解决还不是很清楚,但是我们可以看到X P a t h解析
第10章XML和数据库使用387 下载
器的出现是位于特别数据库层的顶端,就像O D B C站在不同低层数据存储格式的顶端一样。
10.2.3 结论
X M L提供了一个相当强大的在不同数据间交换数据的方法。这个对于数据库特别有用,因
为在不同类型数据间发生的数据相互交换是相当困难的。
尽管数据可以以一种普通的格式被表示,并没有什么用于取回的可以接受的标准。尽管不
像我们希望地那样灵活,用X P a t h指定查询说明了使用标准查询语法的潜力。
10.2.4 你可能需要的标准
我们已经讨论了用于选择X M L数据的不同可能的查询语法。对于查询标准的问题,我们也
讨论了如何返回数据结果的论点。提出几个标准指示应该如何去做。
1. 片段数据交换
最简单和可能最有效的是片段数据交换建议,在h t t p : / / w w w. w 3 . o rg / T R / W D - x m l - f r a g m e n t。
这个提议提供了一种机制,通过对它的松散的节点给出一些上下文。在第8章我们已经看到了这
一点,但是现在拿来在这里使用,并且看一个例子:取出一个作者的传记。我们在前面所写的
代码允许使用下面的语法:
来取回:
程序清单1 0 - 3 0
片段数据交换的提议建议,应创建一个提供上下文的分离的文档:
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(127)