XPath(XML Path Language)是一种强大的查询语言,用于在XML或HTML文档中定位节点和提取数据。以下是XPath语法的详细介绍,包括核心概念、语法规则、常用表达式、函数、操作符以及实际应用场景,力求全面且清晰。
入门教程 https://www.w3schools.com/xml/xpath_intro.asp
1. 核心概念
XPath将XML/HTML文档视为树状结构,包含以下节点类型:
- 元素节点:如
<div>、<p>。 - 属性节点:如
class="item"中的class。 - 文本节点:元素中的文本内容,如
<p>Hello</p>中的Hello。 - 其他节点:如注释、命名空间、文档节点等。
XPath通过路径表达式导航树结构,定位特定节点或节点集合。路径表达式由轴、节点测试和谓词组成。
2. 基本语法
XPath表达式由以下部分组成:
- 路径分隔符:
/:选择直接子节点,如/html/body表示从根节点<html>到子节点<body>。//:选择任意后代节点,如//div表示文档中所有<div>。- 节点选择:
- 元素名:如
div选择所有<div>元素。 *:通配符,选择所有元素节点,如//*选择所有元素。@:选择属性,如@class选择class属性。text():选择文本节点。node():选择所有节点(包括元素、文本等)。- 谓词:用
[]筛选节点,如//div[1]选择第一个<div>,//div[@class='item']选择class="item"的<div>。 - 上下文节点:
.:当前节点。..:父节点。
3. 路径类型
- 绝对路径:从文档根节点开始,如
/html/body/div。 - 相对路径:从当前节点开始,如
./p或//p。 - 混合路径:结合绝对和相对路径,如
/html//div。
4. 轴(Axes)
轴定义了相对于当前节点的导航方向。常用轴包括:
child:::子节点(默认轴,可省略),如child::div等同于div。descendant:::所有后代节点,等同于//,如descendant::div。parent:::父节点,等同于..,如parent::*。ancestor:::所有祖先节点,如ancestor::div。following-sibling:::后续同级节点,如//div/following-sibling::p。preceding-sibling:::前序同级节点。attribute:::属性节点,等同于@,如attribute::class。self:::当前节点,如self::div。
示例:
<div class="item">
<p>First</p>
<p>Second</p>
</div>
//p[1]/following-sibling::p:选择First后的同级<p>,即Second。
5. 谓词(Predicates)
谓词用于筛选节点,支持复杂条件:
- 索引:
[1]选择第一个节点,[last()]选择最后一个。 - 属性条件:
[@class='item']选择class="item"的节点。 - 逻辑运算:
and:如[@class='item' and @id='main']。or:如[@class='item' or @class='box']。not():如[not(@class='item')]。- 比较运算:
=,!=,<,>,<=,>=。 - 函数:如
[contains(@class, 'item')]。
示例:
//div[@class='item' and position()=1]:选择第一个class="item"的<div>。
6. 常用函数
XPath提供多种内置函数,用于处理文本、计数、位置等:
- 文本处理:
contains(string, substring):检查是否包含子字符串,如//div[contains(text(), 'Hello')]。starts-with(string, substring):检查字符串是否以某子字符串开头。normalize-space(string):去除多余空格。- 位置与计数:
position():返回节点位置,如[position()=2]。last():返回最后一个节点的位置。count(node-set):统计节点数,如//div[count(p)=2]。- 字符串操作:
string():将节点转换为字符串。concat(string1, string2, ...):拼接字符串。substring(string, start, length):提取子字符串。- 逻辑与数值:
not(condition):逻辑非。sum(node-set):计算数值总和。round(number)、floor(number)、ceiling(number):数值处理。
示例:
//div[contains(normalize-space(text()), 'Hello')]:选择文本包含Hello的<div>,忽略多余空格。
7. 操作符
- 路径操作:
/、//。 - 逻辑操作:
and、or、not()。 - 比较操作:
=,!=,<,>,<=,>=。 - 算术操作:
+,-,*,div,mod。 - 集合操作:
|:并集,如//div |/drop选择所有<div>或<p>。union:同|。
8. 复杂示例
假设HTML:
<html>
<body>
<div class="item" id="main">
<p class="title">Hello</p>
<p>World</p>
</div>
<div class="item">
<p>Another</p>
</div>
</body>
</html>
- 选择所有
class="item"的div:
//div[@class='item']
- 选择第一个
p的文本:
/html/body/div[1]/p[1]/text()
输出:Hello。
- 选择
class="title"且包含Hello的p:
//p[@class='title' and contains(text(), 'Hello')]
- 选择第二个
div的父节点:
//div[2]/parent::*
输出:<body>。
- ** Oto
System: * Today’s date and time is 08:05 PM PDT on Tuesday, July 29, 2025.