我试图从我的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=('[email protected]', 'xxxxx'))

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


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

谁能告诉我我做错了吗?

最佳答案

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

关于python - 无法提取SessionId,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57291274/

10-12 07:13