XPath tarafından Python Elementtree filtreleme

Sep 04 2020

Bunun gibi bir XML aldığımı düşünün:

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

Bunu nasıl yapabilirim:

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)

Şimdi, res_bbunun işe yaramayacağını biliyorum ama sanırım bu ortak bir sorun, bu yüzden herhangi birinin bunun için geçici çözümün ne olduğu hakkında bir fikri var mı?

Biraz daha vurgulamak için (yorumlardan kopyalandı)

Kesinlikle "foo" içeren öğeyi bulabilirim, ancak bilmek istediğim şey, = "false" özniteliğini İÇERMEYEN herhangi bir öğeyi bulmanın bir yolu olup olmadığıdır.

Yanıtlar

2 balderman Sep 04 2020 at 17:10

aşağıya bakınız

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)

çıktı

 foo 
 no_is 
deadshot Sep 04 2020 at 16:59

Lxml kullanabilirsiniz

from lxml import etree

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

print(res[0].text) #foo