Я использую zeep для извлечения данных из службы SOAP.В моем случае ответом является xsd:any
, и Zeep не имеет ни малейшего представления, что это такое, поэтому он просто возвращает lxml.element
( объяснение на github )
Каков наилучший способ справиться с этимдело?
Вот как я пытаюсь сделать это сейчас:
from io import StringIO
import xml.etree.ElementTree as ET
# define a couple of helpers
def strip_namespaces(xml):
"""
parses raw xml and removes namespaces from tags.
"""
iterable = ET.iterparse(StringIO(xml))
for _, el in iterable:
if '}' in el.tag:
el.tag = el.tag.split('}', 1)[1] # strip all namespaces
root = iterable.root
return root
def element_to_dict(element):
"""converts lxml object into python dict"""
return (element.tag,
dict(map(element_to_dict, element)) or element.text)
with client.settings(raw_response=True): # ask zeep to don't parse response
result = client.service.Method(argument)
el = strip_namespaces(result.text)
_, response_dict = element_to_dict(el)
print(response_dict)
Это работает (я думаю), но выглядит несколько многословно и хрупко.Есть ли более "питонический" способ?