新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   >>中国XML论坛<<     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 关于 XML 的一般性技术讨论,提供 XML入门资料 和 XML教程
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML基础 』 → [转帖] XPath所有运用 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4132 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: [转帖] XPath所有运用 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     guoyan1981 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究C++)
      文章:35
      积分:298
      注册:2004/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guoyan1981发送一个短消息 把guoyan1981加入好友 查看guoyan1981的个人资料 搜索guoyan1981在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guoyan1981的博客楼主
    发贴心情 [转帖] XPath所有运用

    XPath所有运用

    XPath一套语法规则,用语定义XML文档的各个部分。


    --------------------------------------------------------------------------------

    什么是XPath?
    XPath是定义XML文档各部分的语法


    XPath使用路径定义XML元素


    XPath定义了一个标准函数库


    XPath是XSLT的一个主要元素


    XPath不是用XML书写的


    XPath是一个W3C标准

    --------------------------------------------------------------------------------

    类似传统的文件路径
    XPath使用路径表达式识别XML文档里的节点。这些路径表达式看起来很象计算机的文件系统:

    w3schools/xpath/session1.htm

    --------------------------------------------------------------------------------

    XPath示例
    看下面的一个简单XML文档:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <catalog>  
             <cd country="USA">    
             <title>Empire Burlesque</title>    
             <artist>Bob Dylan</artist>    
    <price>10.90</price>  
    </cd>  
    <cd country="UK">    
              <title>Hide your heart</title>    
              <artist>Bonnie Tyler</artist>    
              <price>9.90</price>  
    </cd>  
    <cd country="USA">    
              <title>Greatest Hits</title>     
              <artist>Dolly Parton</artist>     
               <price>9.90</price>   
    </cd>
    </catalog>

    下面的XPath表达式选择根元素catalog:

    /catalog

    下面的XPath表达式选择catalog元素的所有cd元素:

    /catalog/cd

    下面的XPath表达式选择catalog元素下所有cd元素的所有price元素:

    /catalog/cd/price

    注意: 如果路径以一个斜线(/)开始,代表相对于一个元素的绝对路径!


    --------------------------------------------------------------------------------

    XPath定义了一个标准函数库
    XPath定义了一个标准函数库,用于字符串、数字和布尔表达式。

    下面的XPath表达式选择price大于10.80的所有cd元素:

    /catalog/cd[price>10.80]

    --------------------------------------------------------------------------------

    XPath被用于XSLY
    XPath是XSLT的一个主要元素。没有XPath知识,我们将无法建立一个XSLT文档。


    --------------------------------------------------------------------------------

    XPath是一个W3C标准
    XPath作为一个寻址XML文档各部分的语言,于1999年11月16日作为W3C推荐标准发布。

    XPath被设计用于XSLT、XPointer和其它XML解析软件。

    更多的XML和XSL标准,请参考http://www.w3cschools.com。

    XPath使用路径表达式定位XML文档内的节点。


    --------------------------------------------------------------------------------

    XML示例文档
    我们将使用如下的简单XML文档描述XPath语法:

    <?xml version="1.0" encoding="ISO-8859-1"?><catalog>  <cd country="USA">    <title>Empire Burlesque</title>    <artist>Bob Dylan</artist>    <price>10.90</price>  </cd>  <cd country="UK">    <title>Hide your heart</title>    <artist>Bonnie Tyler</artist>    <price>9.90</price>  </cd>  <cd country="USA">    <title>Greatest Hits</title>     <artist>Dolly Parton</artist>     <price>9.90</price>   </cd></catalog>

    --------------------------------------------------------------------------------

    定位节点
    XML文档可以看作是一个节点树(非常类似于计算机的树形文件夹)。

    XPath使用模式表达式识别XML文档里的节点。一个XPath模式是一个以斜线分隔的子元素名列表,用于描述XML文档的一个路径。模式选择匹配该路径的元素。

    下面的XPath表达式选择catalog元素的所有cd元素的所有price元素:

    /catalog/cd/price


    注意: 如果路径以一个斜线(/)开始,代表相对于一个元素的绝对路径!

    注意: 如果路径以两个斜线开始,表示选择文档中所有符合该条件的元素(即使它们在不同的XML树的级别)!

    下面的XPath表达式选择文档中所有的cd元素:

    //cd

    --------------------------------------------------------------------------------

    选择未知元素
    通配符(*)用来选择未知XML元素。

    下面的XPath表达式选择catalog元素下所有cd元素的所有子元素:

    /catalog/cd/*


    下面的XPath表达式选择catalog元素的孙子元素下所有的price元素:

    /catalog/*/price


    下面的XPath表达式选择有两个祖先的所有price元素:

    /*/*/price


    下面的XPath表达式选择文档中所有元素:

    //*

    --------------------------------------------------------------------------------

    选择分支
    通过在XPath表达式中使用方括号可以进一步地指定一个元素。

    下面的XPath表达式选择catalog元素的第一个cd子元素:

    /catalog/cd[1]


    下面的XPath表达式选择catalog元素的最后一个子元素(注意:没有first()函数):

    /catalog/cd[last()]


    下面的XPath表达式选择catalog元素下含有price子元素的所有cd元素:

    /catalog/cd[price]


    下面的XPath表达式选择catalog元素下子元素price值等于10.90的所有cd元素:

    /catalog/cd[price=10.90]


    下面的XPath表达式选择catalog元素下price元素值等于10.90的所有cd元素的price元素:

    /catalog/cd[price=10.90]/price

    --------------------------------------------------------------------------------

    选择多个路径
    通过在XPath表达式中使用|操作符,可以选择多个路径。

    下面的XPath表达式选择catalog元素的子元素cd元素下所有的title和artist元素:

    /catalog/cd/title | /catalog/cd/artist


    下面的XPath表达式选择文档中所有title元素和artist元素:

    //title | //artist


    下面的XPath表达式选择文档中所有title、artist、price元素:

    //title | //artist | //price


    下面的XPath表达式选择catalog元素的cd子元素下所有的title元素,以及文档中所有的artist元素:

    /catalog/cd/title | //artist

    --------------------------------------------------------------------------------

    选择属性
    在XPath中,所有属性以前缀@指定。

    下面的XPath表达式选择所有名为country的属性:

    //@country


    下面的XPath表达式选择所有含有country属性的cd元素:

    //cd[@country]


    下面的XPath表达式选择选择所有含有任何属性的cd元素:

    //cd[@*]


    下面的XPath表达式选择属性country等于UK的所有cd元素:

    //cd[@country='UK']
    XPath定位路径

    --------------------------------------------------------------------------------

    一个定位路径表达式返回一个节点集。


    --------------------------------------------------------------------------------

    定位路径表达式
    一个定位路径可以是绝对的或相对的。

    绝对定位路径以一个斜线(/)开头,而相对定位路径没有。两种情况下,定位路径由一个或多个定位步骤组成,每个步骤由一个斜线分隔:

    一个绝对定位路径:
    /step/step/...
    一个相对定位路径:
    step/step/...

    定位步骤从左到右,依次按顺序计算。每个步骤根据当前节点集的节点计算。如果定位路径是绝对的,那么当前节点集包含根节点。如果定位路径是相对的,那么当前节点集包含使用表达式的节点。定位步骤包括:

    一个轴(指定当前定位步骤和当前节点选择的节点间的树关系)

    一个节点测试(指定定位步骤选择的节点的节点类型和扩展名)

    零或多个预测(使用表达式进一步抽取定位步骤选定的节点集)
    一个定位步骤的语法为:

    轴名::节点测试[预测]

    示例:

    child::price[price=9.90]

    --------------------------------------------------------------------------------

    轴和节点测试
    一个轴定义相对于当前节点的节点集。节点测试用于识别轴内的一个节点。我们可以通过名或类型来执行一个节点测试。

    轴名 描述
    ancestor 包含当前节点的所有祖先节点

    注意: 除非当前节点是根节点,否则这个轴始终包括根节点

    ancestor-or-self 包括当前节点和所有当前节点的祖先节点
    attribute 包含当前节点所有的属性
    child 包含当前节点所有的子节点
    descendant 包含当前节点的所有后代节点

    注意:这个轴不包括属性或命名空间节点

    descendant-or-self 包含当前节点本身和所有它的后代节点
    following 包含文档中当前节点的结束标记后所有节点
    following-sibling 包含当前节点后所有的同层节点

    注意: 如果当前节点是属性节点或命名空间节点,那么这个轴为空

    namespace 包含当前节点的所有命名空间节点
    parent 包含当前节点的所有父节点
    preceding 包含文档中当前节点的开始标记之前的所有节点
    preceding-sibling 包含当前节点之前的所有同层节点

    注意: 如果当前节点是一个属性节点或者命名空间节点,那么这个轴为空

    self 当前节点本身

    示例
    示例 结果
    child::cd 选择当前节点的子节点中所有的cd元素(如果当前节点没有cd子节点,那么将返回一个空节点集)
    attribute::src 选择当前节点的src属性(如果当前节点没有src属性,那么返回一个空节点集)
    child::* 选择当前节点的所有子元素
    attribute::* 选择当前节点的所有属性
    child::text() 选择当前节点的文本节点子节点
    child::node() 选择当前节点的所有子节点
    descendant::cd 选择当前节点的后代中所有cd元素
    ancestor::cd 选择当前节点的祖先节点中所有cd元素
    ancestor-or-self::cd 选择当前节点的祖先节点中所有cd元素,如果当前节点是一个cd元素,那么也包括当前节点
    child::*/child::price 选择当前节点的孙子节点中所有price元素

    / 选择文档根

    --------------------------------------------------------------------------------

    预测
    一个预测过滤一个节点集为一个新的节点集。预测放在方括号([])中。

    示例
    示例 结果
    child::price[price=9.90] 选择当前节点的子节点中price元素等于9.90的所有价格元素
    child::cd[position()=1] 选择当前节点的第一个cd子元素
    child::cd[position()=last()] 选择当前节点的最后一个cd子元素
    child::cd[position()=last()-1] 选择当前节点的倒第二个cd元素
    child::cd[position()<6] 选择当前节点的前五个cd元素
    /descendant::cd[position()=7] 选择文档中第七个cd元素
    child::cd[attribute::type="classic"] 选择当前节点的所有type属性等于classic的cd子节点

    --------------------------------------------------------------------------------

    定位路径缩写语法
    定位路径可以用缩写表示。

    最重要的缩写为:child::可以从一个定位步骤中省略。

    缩写 含义 示例
    none child:: cd是child::cd的简写
    @ attribute:: cd[@type="classic"]是child::cd[attribute::type="classic"]的简写
    . self::node() .//cd是self::node()/descendant-or-self::node()/child::cd的简写
    .. parent::node() ../cd是parent::node()/child::cd的简写

    // /descendant-or-self::node()/ //cd是/descendant-or-self::node()/child::cd的简写

    示例
    示例 结果
    cd 选择当前节点的子节点中所有cd元素
    * 选择当前节点的所有子元素
    text() 选择当前节点的子节点中所有文本节点
    @src 选择当前节点的所有src属性
    @* 选择当前节点的所有属性
    cd[1] 选择当前节点的第一个cd子节点
    cd[last()] 选择当前节点的最后一个cd子节点
    */cd 选择当前节点的所有cd孙子节点
    /book/chapter[3]/para[1] 选择book节点的第三个chapter子节点的第一个para子节点
    //cd 选择所有文档根的所有cd元素后代,因而在同一个文档选择所有的cd元素作为当前节点
    . 选择当前节点
    .//cd 选择当前节点的cd元素后代
    .. 选择当前节点的父亲节点
    ../@src 选择当前节点的父节点的src属性
    cd[@type="classic"] 选择当前节点的子节点中type属性等于classic的所有cd子节点
    cd[@type="classic"][5] 选择当前节点的子节点中type属性等于classic的cd子节点中第五个节点
    cd[5][@type="classic"] 选择当前节点的第五个cd子节点,如果该子节点的type属性等于classic
    cd[@type and @country] 选择当前节点的子节点中由type和country两个属性的所有cd子节点

    XPath表达式

    --------------------------------------------------------------------------------

    XPath支持数值、布尔表达式。


    --------------------------------------------------------------------------------

    数值表达式
    数值表达式用于执行对数字的算术运算。

    操作符 描述 示例 结果
    + 加 6 + 4 10
    - 减 6 - 4 2
    * 乘 6 * 4
    24
    div 除 8 div 4 2
    mod 取模 5 mod 2 1

    注意: XPath在执行算术表达式前总是将每个操作数转换为一个数字。


    --------------------------------------------------------------------------------

    布尔表达式
    布尔表达式用于比较两个值。

    Operator Description 示例 结果
    = Like (equal) price=9.80 真(如果price=9.80)
    != Not like (not equal) price!=9.80 假
    < 小于 price<9.80 假(如果price=9.80)
    <= 小于等于 price<=9.80 真
    > 大于 price>9.80 假
    >= 大于等于 price>=9.80 真
    or 或 price=9.80 or price=9.70 真(如果price等于9.80)
    and 和 price<=9.80 and price=9.70 假
    XPath函数
      
    --------------------------------------------------------------------------------

    XPath包含转换数据的函数库。


    --------------------------------------------------------------------------------

    XPath函数库
    XPath函数库包含一套用于转换和替换数据的核心函数。


    --------------------------------------------------------------------------------

    节点集函数
    函数名 描述
    count() 返回被选择的元素的数目
    id() 通过元素的唯一ID选择元素
    last() 返回最后最后一个节点式第几个节点(等同于总共有几个节点)
    local-name() 返回节点集中第一节点的local name
    name() 返回元素的名称
    namespace-uri() 返回节点集中第一个节点的命名空间的URI
    position() 返回是第几个节点

    字符串函数
    函数名 描述 示例和结果
    concat() 将参数字符串连接后返回 concat('The',' ','XML')
    结果: 'The XML'

    contains() 如果第一个字符串包含第二个字符串,则返回真,否则返回假 contains('XML','X')

    结果: true

    normalize-space() 将字符串中前后空格删除后返回 normalize-space(' The XML')
    结果: 'The XML'

    starts-with() 如果第一个字符串以第二个字符串开头则返回真,否则返回假 starts-with('XML','X')
    结果: true

    string() 将一个对象转换为字符串后返回 string(3.14)
    结果: '3,14'

    string-length() 返回一个字符串的长度 string-length('Beatles')
    结果: 7

    substring() 从字符串的某个偏移位置开始返回指定长度的字符串 substring('Beatles',1,4)
    结果: 'Beat'

    substring-after() 返回字符串中从开始到某一字符串第一次出现的位置后的字符串 substring-after('12/10','/')

    结果: '10'

    substring-before() 返回字符串中从开始到某一字符串第一次出现的位置前的字符串 substring-before('12/10','/')
    结果: '12'

    translate() 替换一个字符串中字符 translate('12:30',':','!')
    结果: '12!30'

    数值函数
    函数名 描述 示例 & 结果
    ceiling() 返回不小于参数的最小整数 ceiling(3.14)
    结果: 4

    floor() 返回不大于参数的最大整数 floor(3.14)

    结果: 3

    number() 转换参数为一个数字 number(price)

    round() 对参数四舍五入 round(3.14)
    结果: 3

    sum() 返回所有参数的和 sum(/cd/price)

    布尔函数
    函数名 描述 示例 & 结果
    boolean() 将参数转换为布尔值    
    false() 返回假 number(false())
    结果: 0

    not() 如果参数是假,则返回真,否则返回假 not(false())
    true() 返回真 number(true())

    结果: 1

    XPath示例
      
    --------------------------------------------------------------------------------

    我们使用CD目录这样一个XML文档来阐述一些XPath示例。


    --------------------------------------------------------------------------------

    CD目录
      

    <?xml version="1.0" encoding="ISO-8859-1"?><catalog>  <cd>    <title>Empire Burlesque</title>    <artist>Bob Dylan</artist>    <country>USA</country>    <company>Columbia</company>    <price>10.90</price>    <year>1985</year>  </cd>  <cd>    <title>Hide your heart</title>    <artist>Bonnie Tyler</artist>    <country>UK</country>    <company>CBS Records</company>    <price>9.90</price>    <year>1988</year>  </cd>....</catalog>   

    在IE6下查看cd目录XML文档cdcatalog.xml。


    --------------------------------------------------------------------------------

    选择节点
    我们将演示怎样使用selectNodes函数在XML文档中选择节点。这个函数使用一个定位路径作为参数:

    xmlobject.selectNodes(XPath expression)

    --------------------------------------------------------------------------------

    选择cd节点
    下面的示例选择cd目录中所有的cd节点:

    xmlDoc.selectNodes("/catalog/cd")

    自我测试。


    --------------------------------------------------------------------------------

    选择第一个cd节点
    xmlDoc.selectNodes("/catalog/cd[1]")

    自我测试。


    --------------------------------------------------------------------------------

    选择price节点
    xmlDoc.selectNodes("/catalog/cd/price")

    自我测试。


    --------------------------------------------------------------------------------

    选择price的文本节点
    xmlDoc.selectNodes("/catalog/cd/price/text()")

    自我测试。


    --------------------------------------------------------------------------------

    选择价格大于10.80的cd节点
    xmlDoc.selectNodes("/catalog/cd[price>10.80]")

    自我测试。


    --------------------------------------------------------------------------------

    选择价格大于10.80的price节点
    xmlDoc.selectNodes("/catalog/cd[price>10.80]/price")


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/10/27 10:40:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML基础 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/20 0:34:48

    本主题贴数2,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  [转帖] XPath所有运用(15510字) - guoyan1981,2004年10月27日
        回复:  不错(4字) - xmzhy,2005年3月22日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms