使用带有转义字符作为参数的XML来使用WSDL URL

时间:2011-10-01 09:22:01

标签: python xml django soap wsdl

我正在执行SOAP Web服务的方法,该方法使用suds库接收3个字符串参数。

第一个字符串参数应该是XML,另外2个是用户名和密码,这是我的半工作实现。

from suds.client import Client
url = "http://www.jonima.com.mx:3014/sefacturapac/TimbradoService?wsdl"
client = Client(url)
client.service.timbrado(XML_AS_STRING_HERE, 'PRUEBA1', '12345678')

当第一个参数包含转义字符(&符号,引号,撇号,小于,大于)时,方法不起作用,因为服务器将文本解释为未转义。如果不包含任何这些字符,那么该方法效果很好

没有&符号的XML示例 http://dl.dropbox.com/u/1990697/no_amp.xml

带&符号的XML示例不起作用 http://dl.dropbox.com/u/1990697/with_amp.xml

知道如何通过转义字符传递XML?

它不必依赖suds而是在python中。 我正在使用python 2.6(如果需要的话,它可以是2.7)

我也在使用Django框架,不知道这是否有用。


额外信息:

  • 我无权修改SOAP服务器
  • 客户支持告诉我,我的xml是正确的,他们的工作原理 他们,所以错误是在我的实现中(或在肥皂水中?)

3 个答案:

答案 0 :(得分:2)

在转换到服务之前,您可以轻松地“转义”任何XML值。查看http://wiki.python.org/moin/EscapingXml

>>> from xml.sax.saxutils import escape
>>>
>>> escape("< & >")
'&lt; &amp; &gt;'

这在过去对我有用,可以完全按照您的描述进行操作,通过网络将XML数据传递到页面。

根据http://www.xmlnews.org/docs/xml-basics.html#references,只需在发送数据之前转义数据就可以了。

解决您的示例XML

...
descripcion="EJE&MPLO"
...
经过后

...
descripcion="EJE&amp;MPLO"
...

答案 1 :(得分:2)

我认为suds图书馆是罪魁祸首。当您将转义的xml作为参数发送到suds作为client.service.timbrado方法时,它也会将其转义。但是,它看到你已经像这样逃过了&符号:

...
descripcion="EJE&amp;MPLO"
...

并没有进一步逃避它(尽管它应该)。您应该通过xml.sax.saxutils.escape运行转义的xml,然后再将其传递给client.service.timbrado

这应该会导致上面的xml片段如下所示:

...
descripcion="EJE&amp;amp;MPLO"
...

当我使用双重转义的xml运行代码时,我收到以下结果:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:timbradoResponse xmlns:ns2="http://sefactura.com">
            <return>
                <status>401 - Fecha y hora de generación fuera de rango</status>
            </return>
        </ns2:timbradoResponse>
    </S:Body>
</S:Envelope>

关于您的数据(生成的日期和时间超出范围)是错误的,而不是关于xml的格式。

答案 2 :(得分:1)

你有没有尝试过逃避它们两次?

如果服务中断,您应该提交错误报告并采取预防措施,以便在修复后发现并解决您的解决方法。