Python元素树XPath属性的多个条件



我正试图通过以下规则从XML中选择节点:

名为"的节点的父节点;标签";具有属性k='k1'和(v='v1'或v='v2'(

如何使用python和ElementTree实现它?我尝试了以下代码,但出现了一个错误";SyntaxError:谓词"无效;

roads = root.findall(".//tag[@k='k1'][@v='v1' or @v='v2']/..")
roads = root.findall(".//tag[@k='k1' and (@v='v1' or @v='v2')]/..")

更新

XML示例

<parent>
<tag k="k1" v="v1"/>
<tag k="k1" v="v2"/>
<tag k="k1" v="v3"/>
</parent>

ET xpath支持非常有限。但是这个黑客应该工作

roads = root.findall(".//tag[@k='k1']/..") or root.findall(".//tag[@k='k2']/..") 

您肯定可以做到这一点,但XPath似乎不是过滤正确属性的方法。

roads = [el for el in root.findall(".//tag") if el.attrib["k"] == "k1" and el.attrib["v"] in ("v1", "v2")]

如果它使它更清晰,则可以将逻辑重写为el.attrib["k"] == "k1" and (el.attrib["v"] == "v1" or el.attrib["v"] == "v2")

最新更新