7

我认为我想做的很像zeep repo 中的 github 问题--- 但遗憾的是,还没有对这个问题的回应。我研究了 suds 并安装并尝试了 - 甚至没有让发送参数工作并且认为 zeep 似乎更好地维护?

编辑1:当然我不是在谈论这个

4

2 回答 2

8

您可以使用插件将 xml 编辑为纯字符串。我使用此插件将字符“<”和“>”保留在 CDATA 元素中。

from xml import etree
from zeep import Plugin

class my_plugin(Plugin):

    def egress(self, envelope, http_headers, operation, binding_options):
        xml_string = etree.ElementTree.tostring(envelope)
        xml_string = xml_string.replace("&lt;", "<")
        xml_string = xml_string.replace("&gt;", ">")
        parser = etree.ElementTree.XMLParser(strip_cdata=False)
        new_envelope = etree.ElementTree.XML(xml_string, parser=parser)
        return new_envelope, http_headers

然后只需在客户端导入插件:

client = Client(wsdl='url', transport=transport, plugins=[my_plugin()])

看看文档:http ://docs.python-zeep.org/en/master/plugins.html

于 2018-03-15T22:06:09.920 回答
1

在 Python 3.9 上,@David Ortiz 的回答对我不起作用,也许有些事情发生了变化。etree_to_string未能将 XML 转换为字符串。

什么对我有用,而不是插件,我创建了一个自定义传输,在发送帖子之前用正确的字符替换剥离的标签,就像大卫的代码一样。

import zeep
from zeep.transports import Transport
from xml.etree import ElementTree

class CustomTransport(Transport):  
    def post_xml(self, address, envelope, headers):  
        message = ElementTree.tostring(envelope, encoding="unicode")  
        message = message.replace("&lt;", "<")  
        message = message.replace("&gt;", ">")  
        return self.post(address, message, headers)  


client = zeep.Client('wsdl_url', transport=CustomTransport())
于 2021-03-30T15:21:55.647 回答