Python, Spyne и lxml: PCDATA invalid Char value

Недавно столкнулся с проблемой – SOAP-сервис, работающий на Spyne, отдавал примерно такую ошибку:

<?xml version='1.0' encoding='UTF-8'?>
<senv:Envelope xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/">
    <senv:Body>
        <senv:Fault>
            <faultcode>senv:Client.XMLSyntaxError</faultcode>
            <faultstring>PCDATA invalid Char value X, line Y, column Z</faultstring>
            <faultactor></faultactor>
        </senv:Fault>
    </senv:Body>
</senv:Envelope>

Проблема оказалась очень простой: в запрос к SOAP-сервису попадал спецсимвол с кодом 0x04, в то время как XML допускает только следующие символы.

На StackOverflow на похожий вопрос есть ответ с указанием передавать в конструктор XMLParser recover=True.

В моем случае передать в XMLParser recover=True получилось вот таким вот (некрасивым) способом:

in_protocol = Soap11(validator='lxml')
in_protocol.parser_kwargs['recover'] = True
out_protocol = Soap11()

soap_application = Application(
    [SoapService], in_protocol=in_protocol, out_protocol=out_protocol)

Leave a Reply

Your email address will not be published. Required fields are marked *