Sajnos, ahogy azt tapasztalhattad ElementTree nem a legokosabb, ha névterekről van szó.
A képességei kimerülnek abban, hogy a különböző keresési metódusoknak átadj egy dict
-et, amiben egy kulcs egy prefix az érték pedig a hozzátartozó uri:
import xml.etree.ElementTree as ET
namespaces = {"s": "http://www.w3.org/2003/05/soap-envelope"}
root = ET.fromstring(xml_source)
print(root.findall("s:Body", namespaces))
Persze ez csak annyit könnyít az életeden, hogy {http://www.w3.org/2003/05/soap-envelope}Body
helyett s:Body
-ra kereshetsz.
Találtam egy drasztikusabb megoldást is a névterek teljes eltávolítására (itt).
Ez valóban eltávolít minden névteret az XML fájlból, viszont ennek a használatát előbb mindenképp gondold át! Nem véletlenül vannak azok a névterek a fájlban, lehet hogy így ütközni fognak a tagek, vagy egyéb információt veszíthetsz.
from io import StringIO
import xml.etree.ElementTree as ET
# instead of ET.fromstring(xml_str)
it = ET.iterparse(StringIO(xml_str))
for _, el in it:
if '}' in el.tag:
el.tag = el.tag.split('}', 1)[1] # strip all namespaces
root = it.root
print(root.findall("Body"))