xpath中的attribute轴和@符号是一回事,@是attribute::的简写形式,两者功能完全相同;在实际使用中,通过//元素/@属性名可直接选取属性节点,如//div/@id;当需要根据属性值筛选时,可结合谓语使用,如//div[@id='header'];而在处理带命名空间的xml属性时,需注意命名空间前缀的影响,可通过local-name()函数绕过前缀限制,确保正确选取目标属性节点。

XPath里要选属性节点,用
attribute
@
id
class
href
嗯,既然说到了
attribute
当你写
//div
div
div
id
//div/@id
@id
attribute::id
div
id
举个例子,假设我们有这么一段HTML:
<div id="main-content" class="container"> <a href="/about" data-track="true">关于我们</a> <input type="text" name="username" value="guest"> </div>
你想选
main-content
div
id
//div[@id='main-content']/@id
href
//a/@href
input
value
//input/@value
它就是这么个逻辑,在元素节点后面跟上
/@属性名
很多人刚接触XPath时会有点迷糊,
attribute::
@
@
attribute::
就像我们平时说话,‘你好’和‘您好’,意思差不多,只是一个更正式点。
attribute::
@
比如,
//div/attribute::id
//div/@id
那什么时候用
attribute::
@
attribute::
@
attribute::
光能选属性还不够,我们经常需要根据属性值来筛选元素。比如,我想找到所有
class
'button primary'
data-id
attribute
[]
最常见的用法是这样:
//元素名[@属性名='属性值']
例如,要找
id
'header'
div
//div[@id='header']
@id
id
=
'header'
再来个稍微复杂点的: 如果你想找所有
input
type
'text'
name
'username'
//input[@type='text' and @name='username']
and
or
not()
href
'download'
contains()
//a[contains(@href, 'download')]
这种结合谓语的用法,才是
attribute
说到属性,就不得不提XML里的命名空间(Namespace)。虽然现在很多前端项目都是HTML5,不怎么直接玩XML,但万一哪天你遇到一个用了XHTML或者SVG、MathML之类的XML方言的页面,或者后端返回的XML数据,那命名空间这事儿就得注意了。
比如,你可能会看到这样的属性:
<svg:path d="M..." />
svg:
//svg:path/@d
svg
xml:lang
@lang
这时候,你可以用
local-name()
lang
//@*[local-name()='lang']
*
namespace-uri()
//@*[local-name()='attrName' and namespace-uri()='http://example.com/ns']
不过说实话,在浏览器环境里,对于HTML DOM,命名空间属性的坑相对少一些,因为浏览器通常会把它们扁平化处理。但如果你在处理纯XML,或者一些特定的XML方言,理解并正确处理命名空间属性是XPath进阶的必修课。这块儿稍微有点绕,但弄明白了就能避免很多头疼的问题。
以上就是XPath的attribute轴怎么选择属性节点?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号