【问题标题】:Consume WSDL url with XML with escaped chars as argument使用带有转义字符作为参数的 XML 使用 WSDL url
【发布时间】:2026-02-24 07:55:02
【问题描述】:

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

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

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 是正确的并且它们适用于 他们,所以错误是在我的实现中(或在泡沫中的某个地方?)

【问题讨论】:

    标签: python xml django soap wsdl


    【解决方案1】:

    我认为 suds 库是这里的罪魁祸首。当您将转义的 xml 作为 client.service.timbrado 方法的参数发送到 suds 中时,它也会对其进行转义。但是,它发现您已经像这样逃脱了 & 符号:

    ...
    descripcion="EJE&MPLO"
    ...
    

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

    这应该导致上面的 xml sn-p 看起来像这样:

    ...
    descripcion="EJE&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】:

    在任何 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"
    ...
    

    【讨论】:

    • xml 参数被正确转义,如果您看到给定dl.dropbox.com/u/1990697/with_amp.xml 的来源,您将看到正确转义的 XML。干杯...
    • 由于您已经在转义字符,因此您无能为力,并且该服务正在运行...这看起来像是一个带有泡沫的错误...快速浏览一下在他们的错误跟踪器中没有列出这个特定的错误。你能尝试用其他服务做你想做的事情吗(看看你的方法是否有效)?您可能很容易从使用 suds 切换到其他东西(suds 在一天结束时真的是一个 xml 解析器......他们很多)
    • 谢谢你,最后的诀窍是再次逃脱,这是滴答声。
    【解决方案3】:

    你有没有尝试过两次逃脱?

    如果服务出现问题,您应该提交错误报告并采取预防措施,以便在修复时您会注意到它,并且应该删除您的解决方法。

    【讨论】:

    • 谢谢,如果我可以将多个选项标记为有效答案,这也将被应用,太糟糕了,我只能投赞成票。