python zeep:将未转义的xml作为内容发送

时间:2018-02-07 03:44:10

标签: python soap soap-client zeep

我认为我要做的事情非常像github issue in zeep repo ---但遗憾的是,对这个问题没有任何回应。我研究了肥皂水并安装并试过 - 甚至没有发送参数工作,并认为zeep似乎更好地保持?

编辑1: 我肯定不是在谈论this

2 个答案:

答案 0 :(得分:2)

您可以使用插件将xml编辑为纯字符串。我用这个插件来保存角色'<'和'>'在CDATA元素中。

class my_lugin(Plugin):

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

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

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

查看文档:{​​{3}}

答案 1 :(得分:0)

在 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())