我正在使用zeep从SOAP服务中检索数据。在我的情况下,响应为xsd:any
,而zeep不知道它是什么,因此它只返回lxml.element
(explanation on 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)
它可以工作(我想),但是看起来有点冗长和脆弱。 还有更“ pythonic”的方式吗?