在使用XPath解析XML或HTML文档时,经常需要筛选出属性值或文本内容处于特定区间的节点,比如筛选价格在某个区间的商品节点、分数处于特定范围的考试记录节点等。XPath本身提供了比较运算符和逻辑运算符,可以组合实现范围查找的需求,下面分场景介绍具体的实现方式。

数值范围查找
当需要筛选节点的数值属性或文本处于某个区间时,可以使用>=、<=、>、<比较运算符结合and逻辑运算符实现。假设我们有如下的XML文档,包含多个商品节点:
<products>
<product id="1">
<name>笔记本</name>
<price>3999</price>
</product>
<product id="2">
<name>鼠标</name>
<price>89</price>
</product>
<product id="3">
<name>键盘</name>
<price>299</price>
</product>
<product id="4">
<name>显示器</name>
<price>1599</price>
</product>
</products>
如果要查找价格处于100到2000之间的商品节点,对应的XPath表达式如下:
//product[price >= 100 and price <= 2000]
这个表达式会匹配到id为3和4的商品节点,因为键盘价格299、显示器价格1599都处于100到2000的区间内。如果不需要包含边界值,只需要把>=换成>,<=换成<即可。
文本长度范围查找
有时候需要筛选文本内容长度处于某个范围的节点,比如查找标题长度在5到20个字符之间的文章节点。XPath 1.0中没有直接获取字符串长度的函数,但是可以通过string-length()函数实现,结合比较运算符完成范围判断。假设XML文档结构如下:
<articles>
<article>
<title>XPath基础教程</title>
</article>
<article>
<title>Java</title>
</article>
<article>
<title>Python数据分析实战入门到精通</title>
</article>
</articles>
要查找标题长度在5到15个字符之间的文章节点,XPath表达式如下:
//article[string-length(title) >= 5 and string-length(title) <= 15]
该表达式会匹配到第一个和第三个文章节点,第一个标题长度8个字符,第三个标题长度14个字符,都符合范围要求,第二个标题长度4个字符会被排除。
日期范围查找
如果节点存储的是日期格式的内容,需要筛选某个日期区间内的节点,同样可以通过比较运算符实现,前提是日期格式统一且符合可比较的规则,比如使用YYYY-MM-DD的格式。示例XML如下:
<records>
<record>
<date>2023-10-01</date>
<content>国庆活动</content>
</record>
<record>
<date>2023-11-15</date>
<content>双十一促销</content>
</record>
<record>
<date>2023-12-20</date>
<content>年终总结</content>
</record>
</records>
要查找日期在2023-10-01到2023-11-30之间的记录节点,XPath表达式如下:
//record[date >= '2023-10-01' and date <= '2023-11-30']
该表达式会匹配到前两个记录节点,第三个记录日期为2023-12-20,不在范围内所以被排除。
在代码中使用的示例
下面以Python的lxml库为例,演示如何使用XPath实现范围查找。首先安装lxml库:
pip install lxml
然后编写代码解析上述商品XML,查找价格区间内的商品:
from lxml import etree
# 商品XML内容
xml_content = """<products>
<product id="1">
<name>笔记本</name>
<price>3999</price>
</product>
<product id="2">
<name>鼠标</name>
<price>89</price>
</product>
<product id="3">
<name>键盘</name>
<price>299</price>
</product>
<product id="4">
<name>显示器</name>
<price>1599</price>
</product>
</products>"""
# 解析XML
tree = etree.XML(xml_content.encode())
# 查找价格在100到2000之间的商品
result = tree.xpath("//product[price >= 100 and price <= 2000]")
# 输出结果
for product in result:
name = product.xpath("name/text()")[0]
price = product.xpath("price/text()")[0]
print(f"商品名称:{name},价格:{price}")
运行上述代码,会输出符合价格区间的商品信息,证明XPath的范围查找逻辑生效。
注意事项
- XPath中的比较运算符需要正确转义,在XML文档或代码中写XPath表达式时,
<要写成<lt;,>要写成<gt;,避免被解析为标签符号。 - 如果节点值不是纯数值类型,比如包含单位,需要先处理掉单位再比较,例如价格是
299元的话,需要先提取数值部分再判断范围。 - 不同XPath版本的可用函数有差异,上述示例基于XPath 1.0,大部分常见解析库都支持该版本,兼容性较好。