频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

XPath在无线应用中的实现(下)

来源:yesky 作者:wayne 出处:巧巧读书 2006-01-12 进入讨论组
下一页 1 2 3 4 

  在本文的第一部分中,我们介绍了XPath并讨论了各种各样的从简单到复杂的XPath查询。 通过把XPath查询应用到XML示例文件,我们详细说明了各种重要的XPath定义比如location step、context node、location path、axes和node - test。
我们然后讨论了多个简单查询组合成的复杂的XPath查询。 我们还讨论了无线二进制XML(WBXML)--XML在无线应用领域的对应物--的抽象结构。 最后我们介绍一个简单的XPath处理引擎的设计。

  在这一部分里,我们打算讨论XPath的更进一步的特性--在一个XML文件上执行复杂检索的操作。 我们将讨论谓词或者过滤器查询以及在XPath中的函数的使用。我们将介绍各种的用于处理WSDL和WML的XPath查询。 我们还将增强我们的XPath引擎的功能,使之包括谓词、函数和不同的数据类型。

  过滤查询和谓词

  让我们从一个将返回任何XML文件当中的根节点的简单查询开始:

  ./node()

  我们可以更进一步,使用另一个简单查询,选择根节点的全部的直接子节点:

  ./node()/*

  如果你想要得到所有的是根节点的直接子节点并且只有一个type属性的节点,那么该怎么办呢? 那么就使用下面的这个查询:

  ./node()/*[attribute::type]
 
  在代码段1中,这个查询将返回binding元素。 由此可见,写在方括号之内的代码attribute::query担负一个过滤器的功能。 XPath中的过滤器被称作谓词(predicate),写在方括号内。 一个谓词作用在一个结点集上--在这个例子中,结点集由根节点的所有的直接子节点组成---应用过滤条件(在这里,结点肯定有一个type属性)到结点集上。 产生的结果就是一个经过过滤的结点集。

  谓词可以从简单到很复杂。 也许XPath谓词的简单形式就像下面的查询中的只是一个数字,返回根元素的第二个子节点(message元素):

  ./node()/*[2]

  查询语句./node()/message[attribute::name="TotalBill"]/text() 将寻找根元素的一个属性name值为TotalBill的特定的message子节点。 查询将返回特定的message元素的所有文本结点。 这个查询将返回代码段1中两个message元素中的第二个。

  XPath 函数

  假定你想要回答下面对代码段1中的WSDL文件所提出的问题:

  1. 最后一个operation元素的name属性的值是什么?

  2.定义元素有多少个message子元素?

  3. 根元素的第一个子元素的名称是什么?

  last()函数

  last()函数将总是指向结点集的最后一个结点。 下面的这个查询,当被应用于代码段1中的WSDL文件的时候,将返回第二message元素(即 名称是TotalBill的message元素):

  ./node()/message[last()]

  注意下面的这条查询也返回相同的message元素:

  ./node()/message[2]

  这两个查询之间唯一的区别就是我们使用数字2来代替last()方法。 事实上在本例中last()函数返回的值就是2(特定location step的结点集中的结点数)。 把这两个相同的查询应用到代码段2中的WSDL文件,这次你会发现两个查询没有返回相同的结果。 代码段2中有三个message元素,所以现在last()函数返回数字3。
注意本讨论中的last()函数总是返回一个数字。

  position()函数

  如果你把下面的这些查询应用到代码段2中的WSDL文件,

  ./node()/message[1]/part

  ./node()/message[2]/part

  ./node()/message[3]/part

  它们将分别返回message元素的第一个、第二个和第三个part子元素。 由此可见节点集中的每个节点都有一个位置。 第一个节点的位置是1,第二个节点的位置是2,以此类推。

  如果你想要得到除第二个以外的所有的message元素,你该怎么办? 你可以使用position()函数取得一个节点的位置。 下面的这条查询将返回代码段2中的第一个和第三个message元素:

  ./node()/message[position()!=2]

  position()函数只是返回指定值所表示的节点的位置。 谓词[position()!=2] 把所有的message元素的位置和2做比较,然后找出位置不是2的节点。
  count()函数
  
  代码段1中的portType元素有多少个message子元素? 数一数你就发现有两个message元素。 在XPath中解决"多少个"这种问题是一个二步的操作。 首先,写一个用来找到你想要统计的所有的子元素的XPath查询。 然后地像下面给出的那样,把 XPath查询传送到count()函数中:

  步骤1: ./node()/message

  步骤2: count(./node()/message)

  count()函数统计XPath查询所得到的节点集中的节点数,并返回这个节点数。

  name()、local-name()和namespace-uri()函数

  如果把下面的查询应用到代码段1中的WSDL文件的话,那么会出现什么情况呢?

  ./node()/*[5]

  它返回根元素的第五个子元素(即service元素)。 service元素本身是一个完整结构,也包含子元素。 因此,这个XPath查询的返回值实际上是一个XML节点而不仅仅是一个元素名。

  name()函数返回XML节点的名称。 例如,下面的查询应用到代码段1中将返回字符串"service":

  name(./node()/*[5])

  同样,下面的查询将返回字符串"wsd:definitions"(使用域名空间前缀的根元素的全名):

  name(./node())

  local-name()和namespace-uri()函数与name()函数类似,除了local-name方法只返回不带域名空间前缀的元素的局部名称,而namespace-uri函数仅仅返回域名空间URI。举例来说,请在代码段1中试验下面的查询:

  local-name(./node())

  namespace-uri(./node())

  第一个查询返回一个字符串" definitions",而第二个查询返回" http://schemas.xmlsoap.org/wsdl/ "。

  String函数

  我们已经知道name()、local-name()和namespace-uri()函数返回字符串。 XPath提供了许多函数用于处理字符串,比如string()、 substring()、substring-before()、 substring-after()、 concat()、starts-with()等等。 下面给出了一个例子来演示一下如何使用string()函数:

  string(./node()/*[2]/part/attribute::name)

  上面的这条查询将寻找根元素的第二个子元素,然后它将得到根元素的第二子元素的所有的part子元素。 接着它将寻找part子元素的name属性,最后它把name属性的值转换为一个字符串格式。 当把这条语句应用到代码段1中的时候,它将输出bill。

  XPath也提供一些布尔函数,返回"true/false",研究一下下面的这条查询:

  boolean(./node()/message)

  当把它应用到代码段1的时候,它返回true。 这是因为boolean()函数判断一个XPath查询产生的节点集是否为空(在我们的例子中,根元素包含两个message子元素)。 如果是空,boolean()函数返回false,否则返回true。URL查看 http://www.qqread.com/xml-soap/k152214601.html 更多文章 更多内容请看无线网状网介绍Wimax技术与趋势家庭无线局域网专题,或进入讨论组讨论。
下一页 1 2 3 4 
收藏此文】【 】【打印】【关闭
较早的文章:2005年 Web2.0 带动的11大软件

较新的文章:理解XML数据库
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章