能否使用XPath按属性值而非属性名查找元素?场景表达式求证
按属性值(忽略属性名)查找元素的XPath方案
当然可以实现!不过你写的表达式有个小误区——*是用来匹配子元素的,不是属性。要遍历元素的所有属性,得用@*这个语法。咱们来一步步拆解正确的写法:
核心思路
XPath中,@*会选中当前元素的所有属性,之后我们可以对这些属性的值做条件判断,只要有任意一个属性满足条件,就会匹配到该元素。
具体表达式示例
1. 匹配任意属性值包含"otp"的input元素
.//input[@*[contains(., 'otp')]]
@*:选中input的所有属性contains(., 'otp'):检查当前属性的值是否包含"otp"(.在这里代表当前属性的值)
2. 匹配任意属性值包含"otp"或"ode"的input元素
结合你的多条件需求,调整后是:
.//input[@*[contains(., 'otp') or contains(., 'ode')]]
针对你给出的示例元素<input id="optSmsCode" type="tel" name="otp" placeholder="SMS-code">,这个表达式会匹配它——因为name属性值是"otp",placeholder属性值包含"ode",两个条件满足其一。
3. 精确匹配属性值(非包含)
如果需要严格匹配属性值等于"otp"(而不是包含),可以把contains换成直接比较:
.//input[@*[.='otp']]
注意事项
- 这个方法会遍历元素的所有属性,不管属性名是什么,完全符合你“不确定属性名,只知道属性值”的需求。
- 如果XML里有命名空间,可能需要额外处理,但你的示例里没有,所以不用考虑。
内容的提问来源于stack exchange,提问作者Ivan Yakushenko
相关产品推荐
相关产品推荐

