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
相关产品推荐
相关产品推荐

