• XPath定位学习记录


    http://www.w3school.com.cn/example/xmle/books.xml

    <!-- Copyright w3school.com.cn -->
    <!-- W3School.com.cn bookstore example -->
    <bookstore>
        <book category="children">
            <title lang="en">Harry Potter</title>
            <author>J K. Rowling</author>
            <year>2005</year>
            <price>29.99</price>
        </book>
            <book category="cooking">
            <title lang="en">Everyday Italian</title>
            <author>Giada De Laurentiis</author>
            <year>2005</year>
            <price>30.00</price>
        </book>
        <book category="web" cover="paperback">
            <title lang="en">Learning XML</title>
            <author>Erik T. Ray</author>
            <year>2003</year>
            <price>39.95</price>
        </book>
        <book category="web">
            <title lang="en">XQuery Kick Start</title>
            <author>James McGovern</author>
            <author>Per Bothner</author>
            <author>Kurt Cagle</author>
            <author>James Linn</author>
            <author>Vaidyanathan Nagarajan</author>
            <year>2003</year>
            <price>49.99</price>
        </book>
    </bookstore>
    上面代码为下面所有例子的Xml文档

    一、Xpath术语
    ●在XPath中,有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点
    1、元素节点(Element Nodes)
    元素节点对应于文档中的第一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI(统一资源标识符),另一部分是本地的命名。
    2、属性节点(Attribute Nodes)
    每一个元素节点都有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父节点的子节点。这就是说,通过查找元素的子节点可以匹配出元素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性
    3、文本节点(Text Nodes)
    文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。
    4、命名空间节点(NameSpace Nodes)
    每一个元素节点都有一个相关联的命名空间节点集。在Xml文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。
    5、处理指令节点(Processing Instruction Nodes)
    处理指令节点对应于Xml文档中的每一条处理指令。它也有扩展名,扩展名和本地命名指向处理对象,而命名空间部分为空。
    6、注释节点(Comment Nodes)
    注释节点对应于Xml文档中的注释
    7、文档/根节点(Root Nodes)
    根节点是一棵树的最上层,根节点是唯一的。树上的其他所有元素节点都是它的子节点或后代节点。

    ●Xml文档是被作为节点树来对待的
    ●树的根被称为文档节点或根节点

    二、节点
    ●节点 (Node)
    <bookstore> 文档节点或根节点
    <book> 是<bookstore>的子节点
    <book>下有四个子节点,为:<title> <author> <year> <price>
    ●基本值:无父或无子的节点
    如:Jk . Rowling 2005
    ●父节点:每个元素以及属性都有一个父节点
    如:book元素是title author year price元素的父节点

    三、选取节点
    1、// 相对路径查找
    如://book 找到所有的book
    //year 找到所有的year
    2、 / 从根节点开始查找
    如: /bookstore 找到bookstore
    /bookstore/book 找到bookstore下的book , book必须在bookstore下
    /book 则不会找到book,必须从根节点开始 ,即bookstore
    /bookstore/book[@category='cooking'] 找到名为cooking 的书 可使用等或不等 = !=
    /bookstore/book[@cover] 找到所有包含cover属性的书
    /bookstore/book[@cover and @category] 没有唯一属性时可以使用组合定位 and or not

    3、. 表示当前路径 相当于根节点
    4、.. 表示当前节点的父节点
    如: /bookstore/book/pirce[.='29.99'] 找到价格为29.99的书
    /bookstore/book/price[.='29.99']/.. 找到价格为29.99的书的父元素 即 book
    /bookstore/book/price[.='29.99']/../title 找到价格为29.99的书的名称
    5、 @ 表示选取属性
    如: //@lang 找到所有的lang属性
    //@lang[1] 找到每个元素下的第一个lang属性 (会选中多个,如果要定位可以和其他进行组合)
    //book[@category='children']//@lang 找到书名为children下的lang属性
    6、 节点名称
    bookstore 找到bookstore节点
    bookstore/book 找到book元素
    7、not 表示没有这个属性
    如: //book/*[not(@lang)] 找到没有lang属性的元素, * 表示所有元素

    练习:找到最一个title
    //title[.='XQuery Kick Start']
    //book[@category='web' and not(@cover)]/title
    //author[text()='James McGovern']/../title
    /bookstore/book/title[.='XQuery Kick Start']
    /bookstore/book/price[.='49.99']/../title
    /bookstore/book[last()]
    /bookstore/book[position()=4] 使用位置函数

    8、* 表示当前路径下的所有文档
    /bookstore/book/* 找到book下的所有子元素
    /bookstore/book/*[.="2003"] *与属性结合

    9、运算符 | + - * div = != < <= > >= or and mod
    //price[.>30] 价格大于30
    //price[.<=40] 价格小于等于 40
    //price[text()!=50] 这里的text() 和 . 的作用相同

    10、模糊查询 contains()
    //book/*[contains(text(),"De")]
    //book/*[contains(@category,"oo")]

    11、亲属关系 轴 先找到一个好找的元素,再基于该元素找到其他难定位的元素
    parent::* 表示当前节点的父节点元素
    ancestor::* 表示当前节点的祖先节点元素
    child::* 表示当前节点的子节点元素
    descendant::* 表示当前节点的所有后代元素
    self::* 表示当前节点的自身元素
    ancestor-or-self::* 表示当前节点及它的祖先节点的元素
    descendant-or-self::* 表示当前节点及它的后代节点的元素
    following-sibling::* 表示当前节点的后序所有兄弟节点元素
    preceding-sibling::* 表示当前节点的前面所有兄弟节点元素
    following::* 表示当前节点的后序所有元素
    preceding::* 表示当前节点的前面所有元素

    //price[.=39.95]/preceding-sibling::year

    练习:基于第三本书,用轴的方法找到前一本、后一本、父节点、子节点中的year
    //book[@category="web" and @cover="paperback"]/following-sibling::book[1] 前一本
    //book[@category="web" and @cover="paperback"]/preceding-sibling::book[1] 后一本
    //book[@category="web" and @cover="paperback"]/parent::bookstore 父节点
    //book[@category="web" and @cover="paperback"]/child::year 子节点中的year

    //book[3]/preceding-sibling::book[@category="cooking"] 前一本
    //book[3]/following-sibling::book[1] 后一本
    //book[3]/parent::bookstore 父节点
    //book[3]/child::year 子节点中的year

    孙节点:
    /bookstore/descendant::year[1] 孙节点的第一个year 跨过了book

    祖先节点:
    //price[.="29.99"]/ancestor::bookstore price的祖先节点,跨过了book

    12、函数
    last()
    postion()
    /bookstore/book[last()]
    /bookstore/book[position()=4

  • 相关阅读:
    django with mysql (part-4)
    django with mysql (part-3)
    django with mysql (part-2)
    [LeetCode] 22. 括号生成(回溯/DP)
    [算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数gcd)
    [算法]体积不小于V的情况下的最小价值(0-1背包)
    [LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)
    [LeetCode]98. 验证二叉搜索树
    [LeetCode]21. 合并两个有序链表(递归)
    [LeetCode]538. 把二叉搜索树转换为累加树
  • 原文地址:https://www.cnblogs.com/test-chen/p/10283875.html
Copyright © 2020-2023  润新知