【问题标题】:Can not extract SessionId无法提取 SessionId
【发布时间】:2019-07-31 12:57:04
【问题描述】:

我正在尝试从我的 SOAP API 响应 (XML) 中提取 sessionId。但是,无论我尝试什么,Python 仍然给我 sessionId 是空的(当我将响应打印为文本时不是这样)。

我已经尝试了here 的建议,但是在这种情况下它似乎不起作用。也许因为我只能得到根,但我不确定如何从 elementroot 到 elementtree。 请参阅下面的响应 XML 和我的代码:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <LoginResponse xmlns:ns10="http://caretrack.wirelesscar.net/reportrequest" xmlns:ns9="http://caretrack.wirelesscar.net/reportresponse" xmlns:ns8="http://caretrack.wirelesscar.net/matrisrequest"           xmlns:ns7="http://caretrack.wirelesscar.net/matrisresponse" xmlns:ns6="http://caretrack.wirelesscar.net/servicerequest" xmlns:ns5="http://caretrack.wirelesscar.net/serviceresponse"            xmlns:ns4="http://caretrack.wirelesscar.net/machinerequest" xmlns:ns3="http://caretrack.wirelesscar.net/machineresponse" xmlns:ns2="http://caretrack.wirelesscar.net/base"          xmlns="http://caretrack.wirelesscar.net/security">
            <ns2:session>
                <ns2:sessionId>xxxxxx</ns2:sessionId>
            </ns2:session>
        </LoginResponse>
    </soap:Body>
</soap:Envelope>




response = requests.post(url, data=body, headers=headers, auth=('xxxx@xxx.com', 'xxxxx'))

root = ET.fromstring(response.content)
sessionId = root.findall('.//{ns10:http://caretrack.wirelesscar.net/security}ns2:sessionId')

当我使用此代码时,我没有收到任何错误消息,只是“[]”。也尝试了其他方法,但在那种情况下,我得到“无”。

谁能告诉我我做错了什么?

【问题讨论】:

  • 我建议使用特定于 SOAP 的东西 - 例如SUDS 社区(它是 Suds Jurko 的分支,它是原始 Suds 的一个分支 - 均已被废弃)或 Zeep(与 suds 无关)。它们通过类似对象的访问甚至构造对象使提取数据变得更加容易,因此您不必手动处理它。
  • 感谢您的回答。好的,很高兴听到。到时候会考虑这样做。如果有人知道一些简单的方法来以我格式化代码的方式读取 XML,那将非常高兴,所以如果有人知道,请告诉我:)

标签: python xml soap elementtree


【解决方案1】:

sessionId 元素绑定到 http://caretrack.wirelesscar.net/base 命名空间。这有效(注意没有使用前缀):

sessionId = root.findall('.//{http://caretrack.wirelesscar.net/base}sessionId')

由于只有一个sessionId,您可以使用find()(返回单个元素)而不是findall()(返回列表)。


另一种选择是创建带有前缀的字典并在搜索方法中使用它们。见https://docs.python.org/3/library/xml.etree.elementtree.html#parsing-xml-with-namespaces

【讨论】:

  • 非常感谢,这行得通!我对此有点陌生,但我想逻辑是前缀 ns2 将 sessionId 和链接绑定在一起?
  • 是的,XML 文件中的xmlns:ns2="http://caretrack.wirelesscar.net/base"ns2 前缀与http://caretrack.wirelesscar.net/base 命名空间相关联,&lt;ns2:sessionId&gt; 中的ns2: 表示sessionId 元素属于该命名空间。
  • 现在做到了@DanielHaley。对不起。
  • @JonasH - 不用担心。好问题。 :-)
猜你喜欢
  • 2020-01-09
  • 2019-11-26
  • 2020-08-23
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2013-09-17
  • 1970-01-01
相关资源
最近更新 更多