什么是xpath?

官方解释:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

一句话总结:一句话,XPath 是一门在 XML 文档中查找信息的语言。简单来说,html类似于xml结构,但是没有xml格式那么严格。(在xml中查找信息,包括html)

xpath的作用

xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位

xpath的术语

在 XPath 中,有七种类型的节点:元素属性文本命名空间处理指令注释以及文档(根)节点。XML 文档是被作为节点树来对待的,树的根被称为文档节点或者根节点

<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
</book>
</bookstore> <!--
<bookstore> (文档节点)
<author>J K.Rowling</author> (元素节点)
lang="en" (属性节点)
-->

节点关系

父(parent)

每一个元素以及属性都有一个父

<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>

在上面的例子中,book元素是title、author、year 以及 price 元素的父

子(Children)

元素节点可有零个、一个或多个子。

<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<price>29.99</price>
</book>

在上面的例子中,title、author以及 price 元素都是 book 元素的子

同胞(Sibling)

拥有相同的父的节点

<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<price>29.99</price>
</book>

在上面的例子中,title、author以及 price 元素都是同胞

先辈(Ancestor)

某节点的父、父的父(爷爷),等等

<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
</book>
</bookstore>

在上面的例子中,title 元素的先辈是 book 元素和bookstore 元素

后代(Descendant)

某个节点的子,子的子(孙子),等等

<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
</book>
</bookstore>

在上面的例子中,bookstore 的后代是 book、title、author元素

xpath语法

接下来我们将以下面这个xml文档作为例子

<bookstore>

    <book>
<titlelang="eng">Harry Potter</title>
<price>29.99</price>
</book> <book>
<titlelang="eng">Learning XML</title>
<price>39.95</price>
</book> </bookstore>

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取(绝对位置)
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(相对位置)
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

我们可以看看他是具体怎样使用的

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。
注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语(Predicates)

谓语是用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号[]中。

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()❤️] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例:在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例:在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title|//book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title|//price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

XPath 轴

我们将在下面的例子中使用此 XML 文档:

<bookstore>

    <book>
<titlelang="eng">Harry Potter</title>
<price>29.99</price>
</book> <book>
<titlelang="eng">Learning XML</title>
<price>39.95</price>
</book> </bookstore>

轴可定义相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

步(step)包括:(axis)、节点测试(node-test)、零个或者更多谓语(predicate)

轴(axis):定义所选节点与当前节点之间的树关系

节点测试(node-test):识别某个轴内部的节点

零个或者更多谓语(predicate):更深入地提炼所选的节点集

步的语法:

轴名称::节点测试[谓语]

实例

例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点。
attribute::lang 选取当前节点的 lang 属性。
child:

最新文章

  1. 第三方Android 模拟器流畅速度快,适合开发人员
  2. BZOJ2117: [2010国家集训队]Crash的旅游计划
  3. 第3.2 使用案例1:股票期货stock portfolio 21050917
  4. 利用 PortableBasemapServer 发布地图服务
  5. 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)
  6. x264 - 高品质 H.264 编码器
  7. Linux(Red Hat 6 32位) 下安装Mysql5.6.30
  8. 演练:使用Xamarin.Forms开发产品介绍性质的应用(VB版)
  9. eclipse无法导入已有android项目
  10. JSP标签和JSTL
  11. linux: 用户组, 文件权限详解
  12. cookies和session
  13. [转] ES6 import/export:模块导入导出方式
  14. C# 深拷贝和浅拷贝
  15. CH6901 骑士放置
  16. 机器学习基石笔记:14 Regularization
  17. 29 A Quick Guide to Go&#39;s Assembler 快速指南汇编程序:使用go语言的汇编器简介
  18. Text Relatives II
  19. .NET中的异常和异常处理
  20. css实现一行居中显示,两行靠左显示

热门文章

  1. easyui的combobox模糊搜索
  2. Leetcode题目337:打家劫舍 III(树形DP-中等)
  3. JMeter首金网自营项目-转义及数据库数据乱码的解决
  4. react hook的todolist
  5. tomcat部署web项目的问题
  6. nodejs连接mongodb(密码)
  7. 关于Jmeter测试移动端应用时提示非法登录,不是合法的登录设备时的解决办法
  8. 使用Android Studio时你应该知道的一切配置和使用Genymotion模拟器运行程序
  9. 基于文件系统(及MySQL)使用Java实现MapReduce
  10. JS_&amp;&amp;||