XPath:修订间差异
(→谓词) |
|||
(未显示同一用户的8个中间版本) | |||
第14行: | 第14行: | ||
==数据模型== | ==数据模型== | ||
XPath把XML文档看作一棵树(tree),树包含很多节点(nodes),这一模式仅仅是概念性的,并不要求任何具体的实现。节点分为7种类型: | XPath把XML文档看作一棵树(tree),树包含很多节点(nodes),这一模式仅仅是概念性的,并不要求任何具体的实现。节点分为7种类型: | ||
{| class="wikitable" | |||
|- | |||
! 数据模型名称 !! 描述 !! 示例 | |||
|- | |||
| 根节点(Root Node) || XML文档的顶级节点,是所有其他节点的祖先 || <code><root> ... </root></code> | |||
|- | |||
| 元素节点(Element Node) || 表示XML元素的节点,可以包含其他节点 || <code><book> ... </book></code> | |||
|- | |||
| 属性节点(Attribute Node) || 表示XML元素的属性的节点 || <code><book ISBN="12345"></code> | |||
|- | |||
| 文本节点(Text Node) || 表示XML元素内的文本内容 || <code><title>Introduction to XPath</title></code> | |||
|- | |||
| 注释节点(Comment Node) || 表示XML注释的节点 || <code><!-- This is a comment --></code> | |||
|- | |||
| 处理指令节点(Processing Instruction Node) || 表示XML处理指令的节点 || <code><?xml version="1.0"?></code> | |||
|- | |||
| 命名空间节点(Namespace Node) || 表示XML元素的命名空间声明 || <code><nowiki>xmlns:prefix="http://example.com"</nowiki></code> | |||
|} | |||
{{了解更多 | {{了解更多 | ||
第26行: | 第37行: | ||
}} | }} | ||
== | ==路径表达式== | ||
路径表达式可以用于定位树中的节点。 | |||
=== | {{了解更多 | ||
|[https://www.w3.org/TR/xpath-30/#id-path-expressions W3C:XPath 3.0 - 路径表达式] | |||
}} | |||
===语法=== | |||
===轴描述=== | ===轴描述=== | ||
轴描述,通过XML文件分支树的浏览方向定位。 | 轴描述,通过XML文件分支树的浏览方向定位。 | ||
{| class="wikitable" | |||
|- | |||
! 名称 !! 描述 !! 示例 | |||
|- | |||
| attribute || 选取元素的属性,可使用<code>@</code>来缩写 || <code>/bookstore/book/attribute::price</code> | |||
|- | |||
| child || 子节点,选取当前元素的所有子元素,可以省略不写。 || <code>/bookstore/book</code> <br /><code>/bookstore/child::text()</code> 选取当前节点的所有文本子节点。 | |||
|- | |||
| parent || 父节点,选取当前元素的父元素,可以用 <code>..</code> 来缩写 || <code>/bookstore/parent::node()</code> | |||
|- | |||
| ancestor || 祖先节点,选取当前元素的所有祖先元素,按层级从近到远 || <code>/bookstore/book/ancestor::bookstore</code> | |||
|- | |||
| ancestor-or-self || 自身及祖先节点,选取当前元素的所有祖先元素以及自身,按层级从近到远 || <code>/bookstore/book/ancestor-or-self::bookstore</code> | |||
|- | |||
| following-sibling || 之后同级节点,选取当前元素之后的所有同级元素 || <code>/bookstore/book/following-sibling::book</code> | |||
|- | |||
| preceding-sibling || 之前同级节点,选取当前元素之前的所有同级元素 || <code>/bookstore/book/preceding-sibling::book</code> | |||
|- | |||
| following || 下文节点,在此节点后的所有完整节点,即不包含其祖先节点 || <code>/bookstore/book/following::book</code> | |||
|- | |||
| preceding || 前文节点,在此节点前的所有完整节点,即不包含其子孙节点 || <code>/bookstore/book/preceding::book</code> | |||
|- | |||
| descendant || 选取当前元素的所有后代元素,按层级从近到远 || <code>/bookstore/descendant::book</code> 选取当前节点的所有 book 后代。 | |||
|- | |||
| descendant-or-self || 选取当前元素的所有后代元素以及自身,按层级从近到远 || <code>/bookstore/descendant-or-self::bookstore</code> | |||
|- | |||
| self || 自己,选取当前元素本身,可以用 <code>.</code> 来缩写 || <code>/bookstore/self::bookstore</code> | |||
|- | |||
| namespace || 名称空间,选取元素的命名空间 || <code>/bookstore/book/namespace::*</code> | |||
|} | |||
{{了解更多 | |||
|[https://www.w3.org/TR/xpath-30/#axes W3C:XPath 3.0 - 轴描述] | |||
}} | |||
===节点测试 === | |||
{| class="wikitable" | |||
|- | |||
! 名称 !! 描述 !! 示例 | |||
|- | |||
| node() || 选取所有类型的节点 || <code>//node()</code> | |||
|- | |||
| text() || 选取文本节点 || <code>//text()</code> | |||
|- | |||
| element() || 选取元素节点 || <code>//element()</code> | |||
|- | |||
| attribute() || 选取属性节点 || <code>//attribute()</code> | |||
|- | |||
| comment() || 选取注释节点 || <code>//comment()</code> | |||
|- | |||
| processing-instruction() || 选取处理指令节点 || <code>//processing-instruction()</code> | |||
|- | |||
| * || 选取所有类型的节点(通配符) || <code>//*</code> | |||
|} | |||
{{了解更多 | |||
|[https://www.w3.org/TR/xpath-30/#node-tests W3C:XPath 3.0 - 节点测试] | |||
}} | |||
===谓词=== | |||
谓词(predicate)过滤或称节点描述,通过表达式进一步筛选出满足条件的节点,表达式写在节点后面,用<code>[ ]</code>包围。 | |||
{| class="wikitable" | |||
|- | |||
! 谓词名称 !! 描述 !! 示例 | |||
|- | |||
| [n] || 选择节点集中的第n个节点,从1开始计数 || <code>/bookstore/book[2]</code>选取bookstore的第二个book节点 | |||
|- | |||
| [条件] || 根据条件选择节点,条件可以是比较、逻辑和函数 || <code>/body/div[@class]</code>选取body下带有class属性的div节点 <br /> <code>//div[@id="product5"]</code>选取所有div其中id属性为product5<br /><code>//a[contains(@class, 'product-item')]</code> 选取所有a元素,其中class属于包含product-item <br /><code>//a[contains(., '→')]/@href</code> 获取文本为→的a元素的href,即下一页标签。 <br /> <code>//book[price > 50]</code> 所有book元素中price元素值大于50的元素 | |||
|- | |||
| [position() < n] || 选择节点集中小于第n个节点的节点集 || <code>/bookstore/book[position()<3]</code>选取bookstore的前2个book节点 | |||
|- | |||
| [last()] || 选择节点集中的最后一个节点 || <code>//book[last()]</code> <br /><code>//book[last()-1]</code></code> | |||
|- | |||
| [not(条件)] || 排除满足条件的节点 || <code>//book[not(@lang = 'en')]</code> | |||
|- | |||
| [条件1 and 条件2] || 同时满足多个条件的节点 || <code>//book[price > 20 and @lang = 'en']</code> | |||
|- | |||
| [条件1 or 条件2] || 满足任一条件的节点 || <code>//book[price > 20 or @lang = 'en']</code> | |||
|- | |||
| [条件1 or 条件2 and 条件3] || 使用括号确定条件的优先级 || <code>//book[(price > 20 or @lang = 'en') and @available = 'yes']</code> | |||
|} | |||
{{了解更多 | |||
|[https://www.w3.org/TR/xpath-30/#id-predicate W3C:XPath 3.0 - 谓词 ] | |||
}} | |||
==运算符== | ==运算符== | ||
==函数== | ==函数== | ||
==工具== | |||
{| class="wikitable" | |||
! 名称 | |||
! 描述 | |||
|- | |||
| 复制浏览器网页某个标签xpath | |||
| 在浏览器某个元素右键点击检测,即可打开开发者工具,在网页源代码上某个标签右键,即可选择复制xpath或完整xpath。 | |||
|- | |||
| 浏览器输入xpath查找元素 | |||
| 方法一:按浏览器f12,打开开发者工具,在网页源代码的搜索HTML输入框输入xpath即可定位。<br /> 方法二:打开开发者工具,在控制台通过JavaScript的<code>$x('xpath路径')</code>查找,如输入<code>$x('//div')</code> | |||
|- | |||
| | |||
| | |||
|} | |||
==资源== | ==资源== | ||
===官网=== | ===官网=== | ||
* | *W3C XPath:http://www.w3.org/TR/xpath | ||
*W3C XPath 1.0:https://www.w3.org/TR/xpath-10 | |||
*W3C XPath 2.0:https://www.w3.org/TR/xpath-20 | |||
*W3C XPath 3.0:https://www.w3.org/TR/xpath-30 | |||
== | ===网站=== | ||
*[https://zh.wikipedia.org/wiki/XPath 维基百科:XPath] | *[https://zh.wikipedia.org/wiki/XPath 维基百科:XPath] | ||
*[https://en.wikipedia.org/wiki/XPath 维基百科:XPath(英)] | *[https://en.wikipedia.org/wiki/XPath 维基百科:XPath(英)] | ||
*[https://developer.mozilla.org/zh-CN/docs/Web/XPath MDN:XPath] | *[https://developer.mozilla.org/zh-CN/docs/Web/XPath MDN:XPath] | ||
2023年11月2日 (四) 06:55的最新版本
XPath即为XML路径语言(XML Path Language),它是一种查询语言,用来选取XML文档中的内容。XPath是万维网联盟(W3C)标准。
简介
时间轴
- 1999-11-16,W3C发布XPath 1.0。
- 2010-12-14,W3C发布XPath 2.0。
- 2014-04-08,W3C发布XPath 3.0。
- 2017-03-21,W3C发布XPath 3.1。
版本
语法
数据模型
XPath把XML文档看作一棵树(tree),树包含很多节点(nodes),这一模式仅仅是概念性的,并不要求任何具体的实现。节点分为7种类型:
数据模型名称 | 描述 | 示例 |
---|---|---|
根节点(Root Node) | XML文档的顶级节点,是所有其他节点的祖先 | <root> ... </root>
|
元素节点(Element Node) | 表示XML元素的节点,可以包含其他节点 | <book> ... </book>
|
属性节点(Attribute Node) | 表示XML元素的属性的节点 | <book ISBN="12345">
|
文本节点(Text Node) | 表示XML元素内的文本内容 | <title>Introduction to XPath</title>
|
注释节点(Comment Node) | 表示XML注释的节点 | <!-- This is a comment -->
|
处理指令节点(Processing Instruction Node) | 表示XML处理指令的节点 | <?xml version="1.0"?>
|
命名空间节点(Namespace Node) | 表示XML元素的命名空间声明 | xmlns:prefix="http://example.com"
|
了解更多 >> W3C:XPath 1.0 - 数据模型
路径表达式
路径表达式可以用于定位树中的节点。
了解更多 >> W3C:XPath 3.0 - 路径表达式
语法
轴描述
轴描述,通过XML文件分支树的浏览方向定位。
名称 | 描述 | 示例 |
---|---|---|
attribute | 选取元素的属性,可使用@ 来缩写 |
/bookstore/book/attribute::price
|
child | 子节点,选取当前元素的所有子元素,可以省略不写。 | /bookstore/book /bookstore/child::text() 选取当前节点的所有文本子节点。
|
parent | 父节点,选取当前元素的父元素,可以用 .. 来缩写 |
/bookstore/parent::node()
|
ancestor | 祖先节点,选取当前元素的所有祖先元素,按层级从近到远 | /bookstore/book/ancestor::bookstore
|
ancestor-or-self | 自身及祖先节点,选取当前元素的所有祖先元素以及自身,按层级从近到远 | /bookstore/book/ancestor-or-self::bookstore
|
following-sibling | 之后同级节点,选取当前元素之后的所有同级元素 | /bookstore/book/following-sibling::book
|
preceding-sibling | 之前同级节点,选取当前元素之前的所有同级元素 | /bookstore/book/preceding-sibling::book
|
following | 下文节点,在此节点后的所有完整节点,即不包含其祖先节点 | /bookstore/book/following::book
|
preceding | 前文节点,在此节点前的所有完整节点,即不包含其子孙节点 | /bookstore/book/preceding::book
|
descendant | 选取当前元素的所有后代元素,按层级从近到远 | /bookstore/descendant::book 选取当前节点的所有 book 后代。
|
descendant-or-self | 选取当前元素的所有后代元素以及自身,按层级从近到远 | /bookstore/descendant-or-self::bookstore
|
self | 自己,选取当前元素本身,可以用 . 来缩写 |
/bookstore/self::bookstore
|
namespace | 名称空间,选取元素的命名空间 | /bookstore/book/namespace::*
|
了解更多 >> W3C:XPath 3.0 - 轴描述
节点测试
名称 | 描述 | 示例 |
---|---|---|
node() | 选取所有类型的节点 | //node()
|
text() | 选取文本节点 | //text()
|
element() | 选取元素节点 | //element()
|
attribute() | 选取属性节点 | //attribute()
|
comment() | 选取注释节点 | //comment()
|
processing-instruction() | 选取处理指令节点 | //processing-instruction()
|
* | 选取所有类型的节点(通配符) | //*
|
了解更多 >> W3C:XPath 3.0 - 节点测试
谓词
谓词(predicate)过滤或称节点描述,通过表达式进一步筛选出满足条件的节点,表达式写在节点后面,用[ ]
包围。
谓词名称 | 描述 | 示例 |
---|---|---|
[n] | 选择节点集中的第n个节点,从1开始计数 | /bookstore/book[2] 选取bookstore的第二个book节点
|
[条件] | 根据条件选择节点,条件可以是比较、逻辑和函数 | /body/div[@class] 选取body下带有class属性的div节点 //div[@id="product5"] 选取所有div其中id属性为product5//a[contains(@class, 'product-item')] 选取所有a元素,其中class属于包含product-item //a[contains(., '→')]/@href 获取文本为→的a元素的href,即下一页标签。 //book[price > 50] 所有book元素中price元素值大于50的元素
|
[position() < n] | 选择节点集中小于第n个节点的节点集 | /bookstore/book[position()<3] 选取bookstore的前2个book节点
|
[last()] | 选择节点集中的最后一个节点 | //book[last()] //book[last()-1]
|
[not(条件)] | 排除满足条件的节点 | //book[not(@lang = 'en')]
|
[条件1 and 条件2] | 同时满足多个条件的节点 | //book[price > 20 and @lang = 'en']
|
[条件1 or 条件2] | 满足任一条件的节点 | //book[price > 20 or @lang = 'en']
|
[条件1 or 条件2 and 条件3] | 使用括号确定条件的优先级 | //book[(price > 20 or @lang = 'en') and @available = 'yes']
|
了解更多 >> W3C:XPath 3.0 - 谓词
运算符
函数
工具
名称 | 描述 |
---|---|
复制浏览器网页某个标签xpath | 在浏览器某个元素右键点击检测,即可打开开发者工具,在网页源代码上某个标签右键,即可选择复制xpath或完整xpath。 |
浏览器输入xpath查找元素 | 方法一:按浏览器f12,打开开发者工具,在网页源代码的搜索HTML输入框输入xpath即可定位。 方法二:打开开发者工具,在控制台通过JavaScript的 $x('xpath路径') 查找,如输入$x('//div')
|
资源
官网
- W3C XPath:http://www.w3.org/TR/xpath
- W3C XPath 1.0:https://www.w3.org/TR/xpath-10
- W3C XPath 2.0:https://www.w3.org/TR/xpath-20
- W3C XPath 3.0:https://www.w3.org/TR/xpath-30