我正在执行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框架,不知道这是否有用。
额外信息:
答案 0 :(得分:2)
在转换到服务之前,您可以轻松地“转义”任何XML值。查看http://wiki.python.org/moin/EscapingXml
>>> from xml.sax.saxutils import escape
>>>
>>> escape("< & >")
'< & >'
这在过去对我有用,可以完全按照您的描述进行操作,通过网络将XML数据传递到页面。
根据http://www.xmlnews.org/docs/xml-basics.html#references,只需在发送数据之前转义数据就可以了。
解决您的示例XML
...
descripcion="EJE&MPLO"
...
经过后
...
descripcion="EJE&MPLO"
...
答案 1 :(得分:2)
我认为suds图书馆是罪魁祸首。当您将转义的xml作为参数发送到suds作为client.service.timbrado
方法时,它也会将其转义。但是,它看到你已经像这样逃过了&符号:
...
descripcion="EJE&MPLO"
...
并没有进一步逃避它(尽管它应该)。您应该通过xml.sax.saxutils.escape
运行转义的xml,然后再将其传递给client.service.timbrado
。
这应该会导致上面的xml片段如下所示:
...
descripcion="EJE&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)
你有没有尝试过逃避它们两次?
如果服务中断,您应该提交错误报告并采取预防措施,以便在修复后发现并解决您的解决方法。