python zeep:发送未转义的 xml 作为内容
python zeep: send un-escaped xml as content
我认为我正在尝试做的事情与 github issue in zeep repo 非常相似 --- 但遗憾的是,目前还没有对这个问题的回应。我研究了 suds 并安装并尝试了——甚至没有让发送参数正常工作,我认为 zeep 似乎维护得更好?
编辑 1:
当然我不是在谈论 this
您可以使用插件将 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("<", "<")
xml_string = xml_string.replace(">", ">")
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()])
在 Python 3.9 上,@David Ortiz 的回答对我不起作用,也许有些事情已经改变了。 etree_to_string
无法将 XML 转换为字符串。
对我有用的是,我创建了一个自定义传输,而不是插件,它在发送 post 之前用正确的字符替换了剥离的标签,就像 David 的代码一样。
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("<", "<")
message = message.replace(">", ">")
return self.post(address, message, headers)
client = zeep.Client('wsdl_url', transport=CustomTransport())
我认为我正在尝试做的事情与 github issue in zeep repo 非常相似 --- 但遗憾的是,目前还没有对这个问题的回应。我研究了 suds 并安装并尝试了——甚至没有让发送参数正常工作,我认为 zeep 似乎维护得更好?
编辑 1: 当然我不是在谈论 this
您可以使用插件将 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("<", "<")
xml_string = xml_string.replace(">", ">")
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()])
在 Python 3.9 上,@David Ortiz 的回答对我不起作用,也许有些事情已经改变了。 etree_to_string
无法将 XML 转换为字符串。
对我有用的是,我创建了一个自定义传输,而不是插件,它在发送 post 之前用正确的字符替换了剥离的标签,就像 David 的代码一样。
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("<", "<")
message = message.replace(">", ">")
return self.post(address, message, headers)
client = zeep.Client('wsdl_url', transport=CustomTransport())