通过XPath过滤Python Elementtree

问题描述

想象我有一个像这样的XML:

<root>
  <elements>
    <element> foo </element>
    <element is="false"> foo </element>
    <element is="false"> bli </element>
    <element is="false"> bla </element>
  </elements>
</root>

我该怎么做:

import xml.etree.ElementTree as ET

root = ET.fromstring(XmlFromAbove)
res_a  = root.findall("element[@is='false']")) ##<- This gives me all elements with the specific attribute
res_b  = root.findall("element[not@is='false']")) ##<- This would be nice to give me all elements without that specific attribute (`<element> foo </element>` in this case)

现在,我知道res_b不起作用,但是我想这是一个普遍的问题,所以任何人都知道解决方法是什么?

要指出一点(从评论中复制)

我可以肯定地找到包含“ foo”的元素,但是我想知道的是,是否有办法找到不包含该属性的任何元素为“ false”。

解决方法

见下文

import xml.etree.ElementTree as ET

xml = '''<root>
  <elements>
    <element> foo </element>
    <element is="false"> foo </element>
    <element is="false"> bli </element>
    <element is="false"> bla </element>
    <element please="false"> no_is </element>
    <element is="true"> with_true_is </element>
  </elements>
</root>'''

root = ET.fromstring(xml)

no_is_lst = [e for e in root.findall('.//element') if 'is' not in e.attrib]
for e in no_is_lst:
    print(e.text)

输出

 foo 
 no_is 
,

您可以使用lxml

from lxml import etree

root = etree.fromstring(data)
res = root.xpath(".//element[not(@is)]")

print(res[0].text) #foo

,

要获取不包含属性is="false" 的元素,请尝试

res_b  = root.findall("element[not(@is='false')]"))