<p>我用<a href="https://stackoverflow.com/questions/10916433/adding-xsitype-and-envelope-namespace-when-using-suds">Adding xsi:type and envelope namespace when using SUDS</a>(<a href="https://stackoverflow.com/a/10977734/696768">https://stackoverflow.com/a/10977734/696768</a>)的答案设法解决了这个问题</p>
<p>我不确定这是唯一可能的解决方案,对我来说,这似乎比其他任何东西都更像是一种黑客攻击,但是它对我当前的场景来说效果很好。在</p>
<p>我使用的解决方案是为客户机制作一个插件,寻找我需要的特定元素xsi:类型="xsd:内景,然后将这些属性添加到这些元素中。在</p>
<p>我最后使用的代码作为参考(从前面提到的stackoverflow问题中进行了一些小的调整):</p>
<pre><code>from suds.plugin import MessagePlugin
from suds.sax.attribute import Attribute
class SoapFixer(MessagePlugin):
def marshalled(self, context):
# Alter the envelope so that the xsd namespace is allowed
context.envelope.nsprefixes['xsd'] = 'http://www.w3.org/2001/XMLSchema'
# Go through every node in the document and apply the fix function to patch up incompatible XML.
context.envelope.walk(self.fix_any_type_string)
def fix_any_type_string(self, element):
"""Used as a filter function with walk in order to fix errors.
If the element has a certain name, give it a xsi:type=xsd:int. Note that the nsprefix xsd must also
be added in to make this work."""
# Fix elements which have these names
fix_names = ['Value', 'anotherelementname']
if element.name in fix_names:
element.attributes.append(Attribute('xsi:type', 'xsd:int'))
plugin=SoapFixer()
</code></pre>
<p>然后我将plugins=[plugin]添加到客户端ctor。在</p>
<p>示例:</p>
^{pr2}$