python zeep: отправить неэкранированный xml в качестве содержимого

Я думаю, что то, что я пытаюсь сделать, очень похоже на проблему github в репозитории zeep --- но, к сожалению, пока нет ответа на этот вопрос. Я исследовал suds, установил и попробовал - даже не заработал параметр отправки, и подумал, что zeep лучше поддерживается?

Редактировать 1: Конечно, я не говорю о это


person Junchao Gu    schedule 07.02.2018    source источник
comment
Вам повезло с этим @Junchao Gu? Я столкнулся с той же проблемой, и мне может понадобиться помощь   -  person David Ortiz    schedule 14.03.2018
comment
@davidivad Я сдался ... Я использовал zeep для создания примера сообщения, а затем отредактировал образец сообщения и отправил с помощью curl .....   -  person Junchao Gu    schedule 14.03.2018
comment
Я нашел решение, оно может вам помочь   -  person David Ortiz    schedule 16.03.2018


Ответы (2)


Вы можете использовать плагин для редактирования 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

person David Ortiz    schedule 15.03.2018
comment
Спасибо, что поделился. Хотя я думаю, что это должна быть функция для отправки необработанного сообщения или отправки данных xml. - person Junchao Gu; 16.03.2018
comment
Это работает на Python 3 с использованием xmlString = etree.tostring(envelope, encoding='unicode'). Кроме того, вам также может понадобиться xmlString = xmlString.replace("&amp;", "&"), если у вас есть амперсанды. - person Martin Burch; 24.07.2019

На 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())
person Jeff Olivr    schedule 30.03.2021