如何使用zeep解析包含XML消息的文本内容?
zeep返回含XML的文本解析方案
第一步:提取有效XML内容
先从zeep返回的文本中截取完整的XML片段,去掉前后无关的普通文本字符,确保XML的起始标签和结束标签完整匹配。如果XML内容存在<、>这类转义符,先用html.unescape()做转义还原。
import html # 假设zeep返回的文本保存在result变量中 xml_start = result.find("<") xml_end = result.rfind(">") + 1 raw_xml = html.unescape(result[xml_start:xml_end])
第二步:选择解析工具
方案1:使用Python标准库xml.etree.ElementTree(无需额外安装依赖)
适合结构简单、没有复杂命名空间的XML场景:
import xml.etree.ElementTree as ET # 解析XML得到根节点 root = ET.fromstring(raw_xml) # 基础路径查询,比如提取所有user节点下的name字段 for name_node in root.findall(".//user/name"): print(name_node.text)
如果是SOAP场景返回的XML大多带命名空间,需要手动指定命名空间映射再查询:
# 按XML头部定义的命名空间配置映射,示例ns0对应的值以实际返回的XML为准 ns_map = {"ns0": "http://www.example.com/soap-service"} # 带命名空间查询节点 order_no = root.find(".//ns0:orderNo", ns_map).text
方案2:使用第三方库lxml(适合复杂XML场景)
解析性能更高,支持完整XPath语法,容错性更强,安装命令:pip install lxml
用法和标准库基本一致,仅导入语句不同:
from lxml import etree as ET root = ET.fromstring(raw_xml) # 其余查询操作和标准库完全兼容
可选优化:直接使用zeep原生能力处理
如果返回的XML本身是标准SOAP响应结构,不需要手动解析文本,调用时添加_raw_response=True参数即可直接获取结构化结果:
from zeep import Client client = Client("你的WSDL地址") # 调用接口时加_raw_response参数 response = client.service.your_method_name(param1=xxx, _raw_response=True) # 可直接通过zeep的序列化方法转成字典 result_dict = response.__dict__
内容的提问来源于stack exchange,提问作者eri
相关产品推荐
相关产品推荐

