我正在尝试使用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>
由于 亚历
答案 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
来获取信息,但这对我有用