在XPath中,计算节点数最常用的方法是使用内置的count函数,它接收一个节点集合并返回其中的节点个数。无论是统计某类元素总量,还是验证结构完整性,这种方式都简单直接。

使用count函数统计节点数
count函数的语法为count(node-set),括号里是任意一个合法的XPath节点选择表达式。例如统计所有的<book>节点数量,可以写成如下XPath:
<?xml version="1.0" encoding="UTF-8"?> <library> <book>Java基础</book> <book>Python入门</book> <book>XPath实战</book> </library>
针对上面的XML,使用XPath表达式count(//book)即可得到结果3。
在Python中调用XPath计算节点数
Python的lxml库支持XPath,可以通过evaluate或直接执行count表达式来获取节点数:
from lxml import etree
xml_text = '''<library>
<book>Java基础</book>
<book>Python入门</book>
<book>XPath实战</book>
</library>'''
tree = etree.fromstring(xml_text.encode('utf-8'))
# 使用count函数计算book节点数
num = tree.xpath('count(//book)')
print('节点数:', int(num))
在浏览器中通过JavaScript计算
现代浏览器提供了document.evaluate方法,同样可以执行count表达式:
// 假设页面中有多个<li>元素
var expr = 'count(//li)';
var result = document.evaluate(expr, document, null, XPathResult.NUMBER_TYPE, null);
console.log('li节点数:', result.numberValue);
处理带命名空间的文档
如果XML带有命名空间,直接使用标签名会匹配不到节点。此时需要在代码中声明命名空间映射,并在XPath中使用前缀:
from lxml import etree
ns = {'ns': 'http://ippipp.com/book'}
xml_text = '''<ns:library xmlns:ns="http://ippipp.com/book">
<ns:book>A</ns:book>
<ns:book>B</ns:book>
</ns:library>'''
tree = etree.fromstring(xml_text.encode('utf-8'))
num = tree.xpath('count(//ns:book)', namespaces=ns)
print('带命名空间节点数:', int(num))
其他统计思路
除了count函数,也可以先选出节点集合再取长度。例如在JavaScript中用querySelectorAll之后的length属性,但严格来说那不属于XPath本身的能力。XPath内部若需条件统计,可配合谓词:
count(//book[price > 10])统计价格大于10的book数量count(//*[@class])统计所有带class属性的元素
通过上述方式,XPath计算节点数既灵活又高效,能够覆盖绝大多数XML与HTML解析场景下的计数需求。