You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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]
  • 逻辑说明:
    1. ancestor-or-self::*[@foo or @bar]:先筛选出所有带有@foo或@bar属性的祖先及自身节点
    2. (@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:55:20