在Python中使用命名空间解析SOAP消息

时间:2015-07-14 17:36:56

标签: python xml xpath soap

我正在尝试使用xPath和ElementTree解析以下SOAP响应,但没有运气。我不确定这是否是最好的方法呢?如果不高兴听到其他建议。

我已经删除了XML以保持可读性。

Details

我想要实现的是能够浏览<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:SelectCmDeviceResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ccm.cisco.com/serviceability/soap/risport70/"> <SelectCmDeviceResult xsi:type="ns1:SelectCmDeviceResult"> <TotalDevicesFound xsi:type="xsd:unsignedInt">24</TotalDevicesFound> <CmNodes soapenc:arrayType="ns1:CmNode[4]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> <item xsi:type="ns1:CmNode"> <ReturnCode xsi:type="ns1:RisReturnCode">Ok</ReturnCode> <Name xsi:type="xsd:string">uk-cucm-pub</Name> <NoChange xsi:type="xsd:boolean">false</NoChange> <CmDevices soapenc:arrayType="ns1:CmDevice[12]" xsi:type="soapenc:Array"> <item xsi:type="ns1:CmDevice"> <Name xsi:type="xsd:string">SIP-Trunk-to-NO-Cluster</Name> <DirNumber xsi:type="xsd:string" xsi:nil="true"/> <Class xsi:type="ns1:DeviceClass">SIP Trunk</Class> <Model xsi:type="xsd:unsignedInt">131</Model> <Status xsi:type="ns1:CmDevRegStat">Registered</Status> 下的每个item标记(上面只显示了一个项目标记,但有多个),然后在{{1}下面如果CmNodes标记文本等于 SIP-Trunk-to-NO-Cluster ,则获取CmDevices/item下的文本,在这种情况下,这将是“已注册”< / p>

由于 亚历

1 个答案:

答案 0 :(得分:0)

确定找到了解决方案,虽然我会在这里发布,以防有​​人发现这个有用。

我尝试使用@IanAuld建议的SUDS(我认为这将是最好的解决方案)但遇到SSL问题,因为我从拉动WSDL的服务器上有自签名证书。

理解名称空间的关键是使用以下cmd并使用lxml

#print all the namespaces used in the xml doc
print root.nsmap

然后我拿出以下代码来获取我需要的信息

 #get all the namespace 
 sip_trunk_name_ele = root.findall(".//item[@xsi:type='ns1:CmNode']/CmDevices[@xsi:type='soapenc:Array']/item[@xsi:type='ns1:CmDevice']/Name[@xsi:type='xsd:string']", namespaces=root.nsmap)
    for sip_trunk_name in sip_trunk_name_ele:
        print(sip_trunk_name.tag,sip_trunk_name.text)
        if sip_trunk_name.text == "SIP-Trunk-to-NO-Cluster":
            print(sip_trunk_name.getparent().tag)
            sip_trunk = sip_trunk_name.getparent()
            return print sip_trunk.findtext('Status')

我确信有更好的方法可以使用lxml来获取信息,但这对我有用