| | | | | | | [文章信息] | | | 作者: | wayne | | 时间: | 2003-04-01 | | 出处: | yesky | | 责任编辑: | 方舟 | |
| [文章导读] | | | 在这一部分里,我们打算讨论XPath的更进一步的特性--在一个XML文件上执行复杂检索的操作 | |
| |
|
| | | |
|
|
|
|
|
一个复杂的WSDL处理实例
下面的WSDL处理方案使用了我们前面讨论过的所有的XPath概念。 这个方案的检索要求如下:
寻找一个service元素,这个元素是definitions元素(根元素)的一个直接子元素,并且name属性与definitions元素的name属性匹配。 然后察看service元素,寻找一个port元素,这个port元素的binding属性与definitions元素的直接子元素binding的name属性匹配。
这个WSDL过程可以用四步完成:
1. 查找definitions元素的name属性值。 下面给出的XPath查询(从代码段中返回字符串BillingService)执行这步操作:
string(//node()[1]/@name)
2. 然后查找name属性匹配definitions元素的name的service元素。 下面的查询将返回所需要的service元素:
./node()[1]/service[@name=string(//node()[1]/@name)]
3. 然后查找binding元素的name属性值:
string(//node()[1]/binding/@name)
4. 最后寻找需要的port元素:
./node()[1]/service[@name=string(//node()[1]/@name)]
/port[@binding=string(//node()[1]/binding/@name)]
这个实例说明XPath谓词可以包含简单逻辑条件,函数调用乃至完整的XPath查询。
使用XPath处理WML
WML是WAP Forum定义的一种XML语言。 WML为小型设备的显示提供了一种表现格式。 WML对于一个小型设备就好像HTML对于一台个人电脑一样。
想象一下,一个WML文件是由一组卡片(card)组成,每个卡片由一个card元素封装。 代码段3是一个简单WML文件,只包含两个card元素。
下面的XPath查询将返回代码段3中包含在第一个卡片之内(这卡片id是" first")的所有的p(paragraph)元素:
./node()/card[string(@id)="first"]/p
下面这个查询返回第二个卡片中的第一段的文本内容:
string(./node()/card[string(@id)="second"]/p[1]/text())
实现XPath谓词与函数
我们现在将看看如何在我们前面的那个简单的XPath引擎中插入谓词与函数的支持。
四个伪代码类XPathExpression(代码段4)、XPathLocationStep(代码段5)、XPathResult(代码段6)和Predicate(代码段7)组成了支持谓词与函数的更新的版本。 我们在上一篇文章介绍的XPath引擎的基础上,增加了下列功能,使之更加强大:
1. XPath可以返回各种类型的数据。 XPath可以返回节点、字符串、数字和布尔变量。 我们设计的XPath引擎只支持XML节点作为返回数据类型。 我们现在已经提供了一个名为XPathResult(见代码段6)的类来支持不同的数据类型。 基于我们的设计的实现需要扩展为每种数据类型分别地扩展XPathResult。
2. 更新的设计现在包括一个支撑函数的结构。 一个函数调用可以发生在一个XPath查询开始时,也可以发生在任何XPath location step。 因此,XPathExpression类(代码段4)和XPathLocationStep类(代码段5)现在都添加了对函数调用的支持。
3. 我们还提供了一个单独的类用于支持谓词(见代码段7)。 一个谓词可以只由一个逻辑条件组成也可以由一个完整的XPath查询组成。 因此,Predicate类构造器将判断谓词到底是一个完整的查询还是仅仅只是一个条件。 如果是一个完整的XPath查询,Predicate表达式将实例化一个新的XPathExpression对象,否则它将只是取得逻辑条件的值。
小结
在前面,我们讨论XPath中谓词与函数的语法和使用。 我们介绍WSDL和WML处理的实例并说明了如何构成更加复杂的XPath查询。 最后,我们增强了在第一篇文章中介绍的XPath引擎的功能。
|
|
|
|
|
|
|
|