[主要编辑基于两天前第一篇文章以来的经验.]
我正在使用Suds构建Python SOAP/XML脚本,但我很难获得生成服务器可接受的SOAP/XML的代码.我曾经认为问题是Suds没有为内部元素生成前缀,但后来发现缺少前缀(参见Sh-Data和内部元素)不是问题,因为Sh-Data和MetaSwitchData元素声明了适当的命名空间(见下文).
<SOAP-ENV:Envelope xmlns:ns3="http://www.metaswitch.com/ems/soap/sh" xmlns:ns0="http://www.metaswitch.com/ems/soap/sh/userdata" xmlns:ns1="http://www.metaswitch.com/ems/soap/sh/servicedata" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns2:Body>
<ns3:ShUpdate>
<ns3:UserIdentity>Meribel/TD Test Sub Gateway 3</ns3:UserIdentity>
<ns3:DataReference>0</ns3:DataReference>
<ns3:UserData>
<Sh-Data xmlns="http://www.metaswitch.com/ems/soap/sh/userdata">
<RepositoryData>
<ServiceIndication>Meta_SubG_BaseInformation</ServiceIndication>
<SequenceNumber>0</SequenceNumber>
<ServiceData>
<MetaSwitchData xmlns="http://www.metaswitch.com/ems/soap/sh/servicedata" IgnoreSequenceNumber="False" MetaSwitchVersion="?">
<Meta_SubG_BaseInformation Action="apply">
<NetworkElementName>Meribel</NetworkElementName>
<Description>TD Test Sub Gateway 3</Description>
<DomainName>test.datcon.co.uk</DomainName>
<MediaGatewayModel>Cisco ATA</MediaGatewayModel>
<CallFeatureServerControlStatus/>
<CallAgentControlStatus/>
<UseStaticNATMapping/>
<AuthenticationRequired/>
<ProviderStatus/>
<DeactivationMode/>
</Meta_SubG_BaseInformation>
</MetaSwitchData>
</ServiceData>
</RepositoryData>
</Sh-Data>
</ns3:UserData>
<ns3:OriginHost>user@domain.com?clientVersion=7.3</ns3:OriginHost>
</ns3:ShUpdate>
</ns2:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
但这仍然失败.问题是Suds为可选元素生成空元素(Mandatory = No在WSDL中标记).但是服务器要求可选元素存在具有合理值或不存在,并且我得到以下错误(因为该<CallFeatureServerControlStatus/>元素不是允许值之一.
提供的用户数据未针对用户数据针对MetaSwitch XML架构进行验证.
详细信息:cvc-enumeration-valid:对于枚举'[Controlling,Abandoned,Cautiously controlling]',值''不是facet-valid.它必须是枚举中的值.
如果我将生成的SOAP/XML带入SOAPUI并删除空元素,那么请求就可以了.
有没有办法让Suds不为可选字段生成空元素,或者让我之后在代码中删除它们?
主要更新
我已经解决了这个问题(我在其他地方已经看过)但是以一种非常不优雅的方式.所以我发布我当前的解决方案,希望a)它可以帮助他人和/或b)有人可以建议更好的解决方案.
事实证明,问题不在于Suds为可选元素生成空元素(Mandatory …