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.