XPath详解

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. 操作符

  • 路径操作///
  • 逻辑操作andornot()
  • 比较操作=, !=, <, >, <=, >=
  • 算术操作+, -, *, 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"且包含Hellop
  //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.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注