如何修改Python XML XPath表达式优先取@foo,无则取@bar?
解决XPath优先取@foo属性、不存在则取@bar的问题
针对你的需求,这里提供两种适配不同XPath版本的可行写法:
XPath 1.0(Python lxml默认支持)
Python常用XML解析库(如lxml)默认支持XPath 1.0,推荐使用这个写法:
ancestor-or-self::*[@foo or @bar]/(@foo | @bar)[1]
- 逻辑说明:
ancestor-or-self::*[@foo or @bar]:先筛选出所有带有@foo或@bar属性的祖先及自身节点(@foo | @bar)[1]:对每个筛选出的节点,优先取@foo(因为它在表达式中靠前),若@foo不存在则取@bar,[1]确保只取第一个匹配的属性
XPath 2.0+(若解析库支持)
如果使用支持XPath 2.0的工具,可以用更直观的条件判断写法:
ancestor-or-self::*/if(@foo) then @foo else @bar
- 逻辑说明:遍历所有祖先及自身节点,对每个节点判断
@foo是否存在,存在则返回@foo,否则返回@bar(若节点也无@bar会返回空值)
你之前写法的问题
你尝试的[@foo or @bar]仅完成了节点筛选,但后续仍只提取@foo属性,导致仅带有@bar的节点无法返回正确值,因此不符合需求。
内容的提问来源于stack exchange,提问作者Defect1ve
相关产品推荐
相关产品推荐

