首页 > 代码库 > Xpath—解决时问题的良药

Xpath—解决时问题的良药

何为良药?

     由于在XML中存在一些问题和缺陷,针对这些问题就产生了响应的解决方案。如:

getElementById方法在解析XML时由于一些原因适不适合的:

        首先XML中每个元素节点不一定有id属性。

        其次XML中的两个元素节点可能有相同的id属性,这样getElementById这个方法就不再能保证找到我们需要的唯一节点了。针对这个原因Xpath就诞生了。

Xpath是什么?

    Xpath是如何产生的呢?它存在的必要是什么呢?接下来就让我们一一解答自己心中的疑问:

    首先Xpath全称是XML Path LanguageXML路径语言),适用于确定XML文档中某节点位置的语言。XPath是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML应用的基础。

    我们可以把它当作类似于SQL一样的查询语言,通过给出的Xpath路径信息(就像SQL命令一样)就可以从XML中查找出符合条件的节点(就像从数据库中返回需要的数据一样)

Xpath如何用?(XPath 路径表达式详解 )

 .路径表达式语法

    1.路径 = 相对路径 |绝对路径

    2.XPath路径表达式 =步进表达式 | 相对路径 "/"步进表达式。

    3.步进表达式=轴 节点测试谓词

说明:

    1.其中轴表示步进表达式选择的节点和当前上下文节点间的树状关系(层次关系),节点测试指定步进表达式选择的节点名称扩展名,谓词即相当于过滤表达式以进一步过滤细化节点集。

    2.谓词可以是0个或多个。多个多个谓词用逻辑操作符and,or连接。取逻辑非用not()函数。请看一个典型的XPath查询表达式:/messages/message//child::node()[@id=0],其中/messages/message是路径(绝对路径以"/"开始),child::是轴表示在子节点下选择,node()是节点测试表示选择所有的节点。[@id=0]是谓词,表示选择所有有属性id并且值为0的节点。

.相对/绝对路径

    如果"/"处在XPath表达式开头则表示文档根元素(表达式中间作为分隔符用以分割每一个步进表达式)如:/messages/message/subject是一种绝对路径表示法,它表明是从文档根开始查找节点。假设当前节点是在第一个message节点【/messages/message[1]】,则路径表达式subject(路径前没有"/")这种表示法称为相对路径,表明从当前节点开始查找。具体请见下面所述的"表达式上下文"。

.表达式上下文

    上下文其实表示一种环境。以明确当前XPath路径表达式处在什么样的环境下执行。例如同样一个路径表达式处在对根节点操作的环境和处在对某一个特定子节点操作的环境下执行所获得的结果可能是完全不一样的。也就是说XPath路径表达式计算结果取决于它所处的上下文。

XPath上下文基本有以下几种:

  1.当前节点(./):

      如./sender表示选择当前节点下的sender节点集合(等同于下面所讲的"特定元素",如:sender)

  2.父节点(../):

       如../sender表示选择当前节点的父节点下的sender节点集合

  3.根元素(/):

       如/messages表示选择从文档根节点下的messages节点集合.

  4.根节点(/*):

   这里的*是代表所有节点,但是根元素只有一个,所以这里表示根节点。/*的返回结果和/messages返回的结果一样都是messages节点。

  5.递归下降(//):

    如当前上下文是messages节点。则//sender将返回以下结果:

/messages//sender:

gkt1980@gmail.com

111@gmail.com

333@gmail.com

/messages/message[1]//sender:

gkt1980@gmail.com

111@gmail.com

    我们可以看出XPath表达式返回的结果是:从当前节点开始递归步进搜索当前节点下的所有子节点找到满足条件的节点集。

  6.特定元素

    如sender:表示选择当前节点下的sender节点集合,等同于(./sender)

注意:在执行XPath时一定要注意上下文。即当前是在哪个节点下执行XPath表达式。这在XMLDOM中很重要。如:在XMLDOM中的selectNodes,selectSingleNode方法的参数都是一个XPath表达式,此时这个XPath表达式的执行上下文就是调用这个方法的节点及它所在的环境。

优点:

    在IE6.0及其以上版本中我们可以使用同样的方式来访问任意深度的XML数据,这给XML数据的解析操作带来了便利。

缺点:

    在Firefox等浏览器中,则是使用了w3c标准的Xpath处理方式,没有IE这么简单的方式。