zoukankan      html  css  js  c++  java
  • XML中的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语法


    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") 

    自我测试。


    http://61.139.52.111:8090/kj/Manfeel/oltl/session1/session1.htm

  • 相关阅读:
    firstResponder
    形而上学
    du -h
    数据本地存贮与数据结构(对象)
    RFC
    oc语言源代码
    HTTP1.1协议中文版-RFC2616
    如何提高团队协作的效率
    iOS应用架构谈 开篇
    nginx版本如何选择?
  • 原文地址:https://www.cnblogs.com/skyblue/p/900187.html
Copyright © 2011-2022 走看看