Python Elementtree กรองโดย XPath

Sep 04 2020

ลองนึกดูว่าฉันมี 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" หรือไม่

คำตอบ

2 balderman Sep 04 2020 at 17:10

ดูด้านล่าง

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 
deadshot Sep 04 2020 at 16:59

คุณสามารถใช้lxml

from lxml import etree

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

print(res[0].text) #foo