XPath 语法入门
XPath 语法入门
什么是 XPath?
XPath(XML Path Language) 是一种用于在 XML 文档中定位节点的语言。它可以用来选择 XML 文档中的元素、属性、文本内容等。此外,XPath 还支持通过条件筛选节点,并且可以结合函数和运算符进行复杂的查询操作。
虽然 XPath 最初是为处理 XML 设计的,但它也被广泛应用于 HTML 文档(如在 Selenium 中用于定位网页元素)。掌握 XPath 的基本语法,能够帮助你高效地提取数据或操作文档。
XPath 的核心概念
1. 节点选择
XPath 可以选择 XML 或 HTML 文档中的节点。常见的节点类型包括:
- 元素节点:如
<book>
、<title>
。 - 属性节点:如
<book id="123">
中的id
属性。 - 文本节点:如
<title>XML Tutorial</title>
中的XML Tutorial
。
2. 轴(Axis)
轴用于指定节点的选择范围。常见的轴包括:
child::
:选择当前节点的所有子节点。parent::
:选择当前节点的父节点。descendant::
:选择当前节点的所有后代节点。self::
:选择当前节点本身。
3. 谓词(Predicate)
谓词用于筛选符合条件的节点。它使用方括号 []
包裹,并可以包含条件表达式。
4. 通配符和函数
XPath 提供了多种通配符(如 *
表示任意元素)和内置函数(如 contains()
、text()
等),用于增强查询能力。
XPath 的基本语法
1. 选择元素节点
使用元素名称直接选择节点:
/books/book
- 上述表达式表示从根节点
/books
下选择所有<book>
元素。
示例 XML 文档:
<books><book id="1"><title>XML Tutorial</title><price>50.00</price></book><book id="2"><title>HTML Guide</title><price>30.00</price></book>
</books>
示例:选择所有 <book>
元素
/books/book
结果会返回文档中所有的 <book>
节点。
2. 使用轴
默认情况下,XPath 使用 child::
轴选择子节点。以下是一些常见的轴示例:
示例:使用 parent::
轴
/books/book/parent::
- 上述表达式返回
<book>
元素的父节点(即<books>
)。
示例:使用 descendant::
轴
/books/descendant::price
- 返回
<books>
下所有后代节点中的<price>
元素。
3. 谓词筛选
谓词用于根据条件筛选节点。常见的谓词包括:
- 筛选特定的元素(如
position()
)。 - 使用比较运算符(
=
,>
,<
,>=
,<=
)。 - 使用逻辑运算符(
and
,or
)。
示例:筛选价格大于 40 的书籍
/books/book[price > 40]
- 返回所有
<book>
元素中,子元素<price>
的值大于 40 的节点。
示例:使用 position()
筛选第一个 <book>
/books/book[position() = 1]
- 返回第一个
<book>
节点。
4. 属性选择
要选择某个元素的属性,可以使用 @
符号:
/books/book/@id
- 上述表达式返回所有
<book>
元素的id
属性值。
示例:筛选 id
为 1 的书籍
/books/book[@id = '1']
5. 文本内容选择
要提取某个元素的文本内容,可以使用 text()
函数:
/books/book/title/text()
- 上述表达式返回所有
<title>
元素中的文本内容。
示例:筛选标题包含 “XML” 的书籍
/books/book[title[contains(text(), 'XML')]]
6. 通配符和函数
XPath 提供了多种通配符和内置函数,用于增强查询能力。
常见的通配符:
*
:匹配任意元素。@*
:匹配任意属性。
示例:选择所有 <book>
的子节点
/books/book/*
常见的函数:
contains()
:判断文本是否包含某个子串。starts-with()
:判断文本是否以某个字符串开头。concat()
:拼接字符串。position()
:返回当前节点的位置。
XPath 的应用场景
1. 数据提取
XPath 常用于从 XML 或 HTML 文档中提取数据。例如:
//table/tr/td[2]
- 上述表达式可以用于提取网页表格中的第二列数据。
2. 自动化测试(如 Selenium)
在自动化测试中,XPath 可以用来定位网页元素。例如:
//*[@id='login-button']
- 上述表达式定位
id
属性为login-button
的按钮。
3. XML 文档处理
XPath 是处理 XML 文档的首选语言之一。例如:
/books/book[price > 40]
- 上述表达式筛选价格大于 40 的书籍。
常见问题与技巧
1. 如何处理重复节点?
如果需要选择某个特定的节点,可以使用 position()
函数。例如:
/books/book[position() = 2]
2. 如何忽略大小写?
XPath 不区分大小写,默认情况下会将文本按原样匹配。可以通过转换函数(如 lower-case()
)处理。
示例:不区分大小写的筛选
//title[contains(lower-case(text()), 'xml')]
3. 如何避免过度具体化?
编写 XPath 表达式时,尽量保持简洁,避免过度依赖路径。例如:
//*[contains(@id, 'login')]
- 上述表达式选择任意
id
属性中包含login
的元素。
总结
通过本文的学习,你应该掌握了 XPath 的基本语法和核心概念,包括节点选择、轴、谓词、属性选择以及函数的使用。这些知识将帮助你高效地处理 XML 文档或提取网页数据。如果你希望进一步深入学习,可以尝试结合实际项目进行练习,例如在自动化测试中编写更复杂的 XPath 表达式。
参考资料
- XPath Tutorial
- Selenium with XPath