Pemfilteran Python Elementtree oleh XPath

Sep 04 2020

bayangkan saya memiliki XML seperti ini:

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

Bagaimana saya bisa melakukan ini:

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)

Sekarang, saya tahu itu res_btidak akan berhasil tetapi saya kira ini adalah masalah umum sehingga ada yang tahu apa solusinya?

Untuk menunjukkannya sedikit lebih (disalin dari komentar)

Saya dapat menemukan elemen yang mengandung "foo" dengan pasti tetapi yang ingin saya ketahui adalah jika ada cara untuk menemukan elemen apa pun yang TIDAK mengandung atribut is = "false".

Jawaban

2 balderman Sep 04 2020 at 17:10

Lihat di bawah

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)

keluaran

 foo 
 no_is 
deadshot Sep 04 2020 at 16:59

Anda bisa menggunakan lxml

from lxml import etree

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

print(res[0].text) #foo