Правильный способ обработки xsd: любой ответ с помощью Zeep - PullRequest
0 голосов
/ 15 ноября 2018

Я использую 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)

Это работает (я думаю), но выглядит несколько многословно и хрупко.Есть ли более "питонический" способ?

...