代码之家  ›  专栏  ›  技术社区  ›  mikl

在用lxml解析之前,我应该从suds输出中去掉XML声明吗?

  •  2
  • mikl  · 技术社区  · 15 年前

    我正在尝试使用 suds lxml .

    肥皂水返回a suds.sax.text.Text 对象与来自SOAP服务的答复。这个 肥皂水.sax.text.text Unicode class . 本质上,它可以与下面的Python语句相比较:

    u'<?xml version="1.0" encoding="utf-8" ?><root><lotsofelements \></root>'
    

    这是不一致的,因为如果XML声明是正确的,那么内容是UTF-8编码的,因此 Python Unicode对象(因为它们存储在一些内部编码中,如UCS4)。

    lxml将拒绝解析这个, as documented ,因为没有明确的答案来解释它应该是什么编码。

    在我看来,有两种方法可以摆脱这种束缚:

    1. 剥去 <?xml> 声明,包括编码。

    目前,我从webservice接收的数据是在ASCII范围内的,所以任何一种方法都可以工作,但对我来说,这两种方法都很难看,而且我不太确定如果我开始接收需要更大范围Unicode字符的数据,会发生什么。

    2 回复  |  直到 15 年前
        1
  •  2
  •   John Machin Santi    15 年前

    你和lxml是对的;有效的XML文档必须是按照 <?xml ..... 标头(默认值:UTF-8)。

    我还建议在suds网站进行一些温和的查询,并对它们的来源进行调查。

        2
  •  1
  •   Tom    15 年前

    嗯,我目前正在实现我的第一个基于Suds的解决方案,并用lxml解析我的响应,没有任何问题,但我认为这可能是因为我用了一种非常直截了当和愚蠢的方式。我的代码是这样的:

    try:
        result = self.client.service.ExportOwnersDetails(fAccess=self.access_id, fParams=params)
    except URLError:
        # TODO: Log timeout here, handle
        return
    response = str(result.fReturn)
    
    if len(response) == 0 or response.find('<?xml ') == -1:
        # TODO: Log import error here, handle
        return
    response = StringIO(response)
    xml = etree.parse(response)
    

    就像我说的,不是很聪明(显然我还有一些日志要做),但这是我的方法。fAccess、fParams和fReturn是与我集成的第三方提供者的命名约定。