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

Zeep中自定义xsd.Element命名空间前缀且不移动声明位置的实现方法

Zeep自定义SOAP头命名空间原地重命名方案

你可以通过以下两种方案实现命名空间前缀自定义,同时保留命名空间声明在首次使用的节点,不上浮到根节点:

方案1:序列化单个元素时指定前缀映射

在序列化你构造的XSD元素实例时,传入prefix_map参数,该配置仅作用于当前元素的序列化过程,不会修改全局命名空间配置:

from zeep.wsdl.utils import serialize

# 构造Header实例(你的原逻辑保持不变)
header_instance = usernametoken_header(
    Id="your-id",
    Username="your-account",
    Password="your-password"
)

# 序列化时指定前缀,命名空间仅声明在当前元素节点
serialized_header = serialize(
    header_instance,
    prefix_map={
        "wsse": "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
        "wsu": "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    }
)

# 将序列化后的节点加入请求头即可使用
client._default_headers.append(serialized_header)

方案2:预定义带前缀的命名空间对象

在构造XSD元素前先声明绑定了前缀的命名空间对象,后续直接用该对象构造元素,从根源上避免自动生成ns前缀:

from zeep import xsd

# 预定义命名空间与对应自定义前缀
WSSE = xsd.Namespace(
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
    prefix="wsse"
)
WSU = xsd.Namespace(
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
    prefix="wsu"
)

# 用预定义命名空间构造元素,代码更简洁,前缀自动生效
usernametoken_header = xsd.Element(WSSE.UsernameToken, xsd.ComplexType([
    xsd.Attribute(WSU.Id, xsd.String()),
    xsd.Element(WSSE.Username, xsd.String()),
    xsd.Element(WSSE.Password, xsd.String())
]))

注意:不要调用全局的client.set_ns_prefix()方法,该方法会强制将所有命名空间声明提升到SOAP根节点,不符合原地声明的需求。

内容的提问来源于stack exchange,提问作者Halvor Holsten Strand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:21:02