XPath通过//comment()定位注释节点,再用string()或data()提取其文本内容;注释是独立节点类型,不可用@或text()访问,如string(//comment()[1])返回首个注释的纯文本。

XPath 本身不直接支持“获取注释节点的内容”,但可以通过定位 comment() 节点,再用 string() 或直接取值来提取其文本内容。关键在于:注释是 XML 中的一种节点类型(node type),不是元素的属性或子文本,必须显式匹配。
用 //comment() 匹配所有注释节点
这是最常用的方式,用于查找文档中任意位置的注释节点:
-
//comment()—— 返回所有注释节点(NodeSet) -
//comment()[1]—— 返回第一个注释节点 -
//book/comment()—— 返回元素直接子级中的注释(注意:不是后代)
提取注释的文本内容(即 中的“这里是内容”)
注释节点本身没有标签名,它的“值”就是内部文本。在大多数 XPath 实现(如 lxml、Saxon、浏览器 DevTools 控制台)中,可直接对 comment 节点调用 string() 或等价方法:
-
string(//comment()[1])→ 返回第一个注释的纯文本内容(如"作者:张三") -
data(//comment()[1])(XPath 2.0+)→ 效果同string(),更语义化 - 在 Python lxml 中:
tree.xpath('string(//comment()[1])')或先取节点再用.text(lxml 的 comment 对象有.text属性)
注意:注释不是元素,不能用 @ 或 text()
常见误区:
- ❌
//comment()/@content—— 注释没有属性 - ❌
//comment()/text()—— 注释节点没有 text() 子节点;它自己就“是文本” - ✅ 正确思路:把注释当做一个独立节点,用
string()或语言绑定提供的取值方式读它的内容
实际例子(XML 片段)
假设 XML 是:
XPath入门
那么:
-
//comment()[1]→ 匹配第一行注释节点 -
string(//comment()[1])→ 返回"全局说明:本文件仅供测试" -
//book/comment()→ 匹配下的注释(即“标题为虚构”那条)
基本上就这些。核心就一条:用 comment() 轴/节点测试定位,再用 string() 提取内容。不复杂但容易忽略注释的节点本质。










