使用Python Suds无法从WSDL导出Operation XML至文件的问题排查
问题分析与解决方案
1. 代码无输出的核心原因
你的代码遍历client.wsdl.types是错误的——types存储的是WSDL中的数据类型定义(比如复杂类型、简单类型),并不是服务端口和操作的入口。这直接导致你找不到目标Operation,后续的build()和文件写入自然不会执行。
2. 如何查找WSDL中Operation的正确属性
要快速了解suds库中WSDL相关对象的属性,直接用Python内置的dir()函数打印对象结构即可:
- 打印服务对象的属性:
print(dir(client.wsdl.services[0])) - 打印端口对象的属性:
print(dir(client.wsdl.services[0].ports[0])) - 打印操作对象的属性:
print(dir(client.wsdl.services[0].ports[0].binding._operations['AddUpdate_Sample_Population']))
另外,也可以直接打印对象本身,suds会输出结构化的信息,帮你理清层级关系:print(client.wsdl.services)
3. 修正后的代码(生成无参数请求XML)
下面的代码会正确遍历WSDL的服务、端口和操作,生成类似SoapUI的空请求XML,并写入文件:
from suds.client import Client import xml.etree.ElementTree as ET from xml.dom import minidom wsdl_url = 'https://sample.com/ccx/service/services_1/Sample_Service/v69.0?wsdl' client = Client(wsdl_url) target_op_name = 'AddUpdate_Sample_Population' operation = None # 遍历服务、端口、操作的正确层级 for service in client.wsdl.services: for port in service.ports: # 获取绑定的操作字典,key是操作名 operations = port.binding._operations if target_op_name in operations: operation = operations[target_op_name] break if operation: break if operation: # 构建空请求(无需传入参数,自动生成结构) request = operation.build() print(request) # 格式化XML并写入文件(解决ET.write默认无缩进的问题) parsed_xml = minidom.parseString(request) formatted_xml = parsed_xml.toprettyxml(indent=" ") with open("xml_output.xml", "w", encoding="utf-8") as f: f.write(formatted_xml) else: print(f"未找到操作:{target_op_name}")
关键说明
- 正确的层级是:
client.wsdl.services→service.ports→port.binding._operations operation.build()方法在不传入参数时,会自动生成包含所有必填/可选字段的空请求结构,和SoapUI的请求编辑器效果一致- 用
minidom格式化XML是为了让输出的文件更易读,避免ElementTree直接写入的无缩进格式
内容的提问来源于stack exchange,提问作者Code_Journey_4_Fun
相关产品推荐
相关产品推荐

