You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:12:50