XPath(一)

  一:概述

  XPath是xml的查询语言,其根据xml文档的结构(层次结构线性结构)使用绝对定位或相对定位的方式,查找符合条件的内容。所谓的层次结构是指层层包含的关系,这有点像操作系统中的嵌套目录;而线性结构是一种并列的关系(线性[Linear]兄弟[Sibling]关系),这种关系是两个或多个节点有一个共同的父节点。在线性兄弟关系中我们还需要了解以下术语:前导兄弟(Preceding sibling)、后继兄弟(Following sibling)。这些关系可以通过以下的实例分析了解清楚:

SystemDisk.xml

  <?xml version="1.0" encoding="utf-8" ?>

<文件系统 名称="系统盘">

 <目录 创建时间="2010-07-28" 名称="Windows">

    <目录 创建时间="2010-07-28" 名称="System32">

      <文件 创建时间="2010-07-28" 名称="cmd.exe"/>

      <文件 创建时间="2010-07-28" 名称="regidet.exe"/>

    </目录>

    <文件 创建时间="2010-07-28" 名称="winhelp.exe"/>

 </目录>

</文件系统>

 

 

 1.层次结构:在以上xml文档中,可以使用XPath表达式"/文件系统/目录/目录/文件"这种层次结构查找到名称为regidet.exe和cmd.exe的文件。这个路径表达式中"/文件系统"表示匹配根节点 下的文件系统节点,"/文件系统/目录"表示在"/文件系统"的基础上再深入一层,匹配"/文件系统"下的"目录"节点,"/文件系统/目录/目录"表示在"/文件系统/目录"的基础上再深入一层匹配"/文件系统/目录"下目录节点,"/文件系统/目录/目录/文件"表示匹配"/文件系统/目录/目录"下的所有文件元素。
2.线性结构:在以上文档中,
    

    <文件 创建时间="2010-07-28" 名称="cmd.exe"/>

      <文件 创建时间="2010-07-28" 名称="regidet.exe"/>

 "文件"元素之间就是兄弟关系。

  • 前导兄弟:在兄弟关系中,名称为cmd.exe的元素出现在regidet.exe的前边,那么文件名称为cmd.exe的元素就是regidet.exe的前导兄弟。

后继兄弟:在兄弟关系中,名称为regide.exe的元素出现在cmd.exet的后边,那么文件名称为regidet.exe的元素就是cmd.exe的后继兄弟。
3.根节点和根元素

    在层次结构的时候提到了一个概念:根节点。在XPath中根节点用"/"(斜线)表示,所谓的根节点是指xml的文档节点,包括xml声明、DOCTYPE声明、顶层的处理指令、顶层注释和根元素节点。

    根元素是指包含其他元素的节点(也可以这样说:所有元素的父节点就是根节点),一个xml文档只能有一个根元素,同时根元素是根节点的一部分。

4.绝对定位和相对定位

   绝对定位:XPath表达式以根节点(/)开始定位称为绝对定位。

   相对定位:XPath表达式不以根节点(/)开始定位称为相对定位,相对定位从当前上下文节点开始定位。

 

二.XPath使用详解

1.相关概念:串联定位步骤和并联定位步骤,轴、节点测试和谓词。

  • 串联定位步骤:每个定位步骤之间用(/)隔开,从最左边开始匹配节点,如果前面匹配失败,后面的匹配就不会继续,如下面的xml文件

  <?xml version="1.0" encoding="utf-8" ?>

<文件系统 名称="系统盘">

 <目录 创建时间="2010-07-28" 名称="Windows">

    <目录 创建时间="2010-07-28" 名称="System32">

      <文件 创建时间="2010-07-28" 名称="cmd.exe"/>

      <文件 创建时间="2010-07-28" 名称="regidet.exe"/>

    </目录>

    <文件 创建时间="2010-07-28" 名称="winhelp.exe"/>

 </目录>

</文件系统>

     如果使用XPath表达式"文件系统/目录/文件",则只能找到名称为"winhelp.exe"的元素。

  • 并联定位步骤(|):如果想获取所有目录下的文件元素,我们可以使用并联定位步骤(相当于或者),表达式可以这样写:"文件系统/目录/文件|文件系统/目录/目录/文件"。当然我们也可以通过相对定位来解决这个问题:"目录/文件"。
  • 轴:复杂的查询可能由3部分组成,轴::节点测试[谓词]。我们先说轴(Axis),轴表示查找的内容是以那个节点为基准并向某一个方向查,或者说从那个节点开始并向某一个方向查。这个基准节点就是轴,XPath中定义了13条轴。
  • 节点测试(Node-test):表示从轴开始要查找的节点。
  • 谓词(Predicate):表示要查找节点的条件。

 

 
posted @ 2010-07-29 01:52  坐看风起  阅读(1828)  评论(0编辑  收藏  举报