Python reads all lines <ns1: Status> Registered </ ns1: Status>
It is necessary to count only in tags <ns1: CmDevices> <ns1: item> no deeper.
The correct value should be 2 not 4. bad result
How to do it?
Original xml:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns1:selectCmDeviceResponse xmlns:ns1="http://schemas.cisco.com/ast/soap">
<ns1:selectCmDeviceReturn>
<ns1:SelectCmDeviceResult>
<ns1:TotalDevicesFound>8000</ns1:TotalDevicesFound>
<ns1:CmNodes>
<ns1:item>
<ns1:ReturnCode>Ok</ns1:ReturnCode>
<ns1:Name>sgo-uc-ccm11.go.rshbank.ru</ns1:Name>
<ns1:NoChange>false</ns1:NoChange>
<ns1:CmDevices>
<ns1:item>
<ns1:Name>BOTARMYAKOVAS</ns1:Name>
<ns1:DirNumber>7414658-Registered</ns1:DirNumber>
<ns1:DeviceClass>Phone</ns1:DeviceClass>
<ns1:Model>575</ns1:Model>
<ns1:Product>462</ns1:Product>
<ns1:BoxProduct>0</ns1:BoxProduct>
<ns1:Httpd>No</ns1:Httpd>
<ns1:RegistrationAttempts>7</ns1:RegistrationAttempts>
<ns1:IsCtiControllable>true</ns1:IsCtiControllable>
<ns1:LoginUserId>Armyakov-AS@go.rshbank.ru</ns1:LoginUserId>
<ns1:Status>Registered</ns1:Status>
<ns1:StatusReason>0</ns1:StatusReason>
<ns1:PerfMonObject>2</ns1:PerfMonObject>
<ns1:DChannel>0</ns1:DChannel>
<ns1:Description>Армяков А.С. (zoom_8888)</ns1:Description>
<ns1:H323Trunk>
<ns1:ConfigName xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:TechPrefix xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:Zone xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RemoteCmServer1 xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RemoteCmServer2 xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RemoteCmServer3 xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:AltGkList xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:ActiveGk xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:CallSignalAddr xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RasAddr xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</ns1:H323Trunk>
<ns1:TimeStamp>1633964311</ns1:TimeStamp>
<ns1:Protocol>SIP</ns1:Protocol>
<ns1:NumOfLines>1</ns1:NumOfLines>
<ns1:LinesStatus>
<ns1:item>
<ns1:DirectoryNumber>7414658</ns1:DirectoryNumber>
<ns1:Status>Registered</ns1:Status>
</ns1:item>
</ns1:LinesStatus>
<ns1:ActiveLoadID>Jabber_for_Android-14.0.3.306226</ns1:ActiveLoadID>
<ns1:InactiveLoadID>Jabber_for_Android-14.0.3.306226</ns1:InactiveLoadID>
<ns1:DownloadStatus>Unknown</ns1:DownloadStatus>
<ns1:DownloadFailureReason xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:DownloadServer xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:IPAddress>
<ns1:item>
<ns1:IP>10.26.43.32</ns1:IP>
<ns1:IPAddrType>ipv4</ns1:IPAddrType>
<ns1:Attribute>Unknown</ns1:Attribute>
</ns1:item>
</ns1:IPAddress>
</ns1:item>
<ns1:item>
<ns1:Name>BOTBOLSHAKOVAOS</ns1:Name>
<ns1:DirNumber>7414388-Registered</ns1:DirNumber>
<ns1:DeviceClass>Phone</ns1:DeviceClass>
<ns1:Model>575</ns1:Model>
<ns1:Product>462</ns1:Product>
<ns1:BoxProduct>0</ns1:BoxProduct>
<ns1:Httpd>No</ns1:Httpd>
<ns1:RegistrationAttempts>16</ns1:RegistrationAttempts>
<ns1:IsCtiControllable>true</ns1:IsCtiControllable>
<ns1:LoginUserId>Bolshakova-OS@go.rshbank.ru</ns1:LoginUserId>
<ns1:Status>Registered</ns1:Status>
<ns1:StatusReason>0</ns1:StatusReason>
<ns1:PerfMonObject>2</ns1:PerfMonObject>
<ns1:DChannel>0</ns1:DChannel>
<ns1:Description>Большакова О.С.</ns1:Description>
<ns1:H323Trunk>
<ns1:ConfigName xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:TechPrefix xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:Zone xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RemoteCmServer1 xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RemoteCmServer2 xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RemoteCmServer3 xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:AltGkList xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:ActiveGk xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:CallSignalAddr xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:RasAddr xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</ns1:H323Trunk>
<ns1:TimeStamp>1633964633</ns1:TimeStamp>
<ns1:Protocol>SIP</ns1:Protocol>
<ns1:NumOfLines>1</ns1:NumOfLines>
<ns1:LinesStatus>
<ns1:item>
<ns1:DirectoryNumber>7414388</ns1:DirectoryNumber>
<ns1:Status>Registered</ns1:Status>
</ns1:item>
</ns1:LinesStatus>
<ns1:ActiveLoadID>Jabber_for_Android-14.0.3.306226</ns1:ActiveLoadID>
<ns1:InactiveLoadID>Jabber_for_Android-14.0.3.306226</ns1:InactiveLoadID>
<ns1:DownloadStatus>Unknown</ns1:DownloadStatus>
<ns1:DownloadFailureReason xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:DownloadServer xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<ns1:IPAddress>
<ns1:item>
<ns1:IP>10.18.43.32</ns1:IP>
<ns1:IPAddrType>ipv4</ns1:IPAddrType>
<ns1:Attribute>Unknown</ns1:Attribute>
</ns1:item>
</ns1:IPAddress>
</ns1:item>
</ns1:CmDevices>
</ns1:item>
</ns1:CmNodes>
</ns1:SelectCmDeviceResult>
</ns1:selectCmDeviceReturn>
</ns1:selectCmDeviceResponse>
</soapenv:Body>
</soapenv:Envelope>
My code Python:
from xml.dom import minidom
doc = minidom.parse('new.xml')
doc_1 = doc.getElementsByTagName("ns1:CmDevices")[0]
#doc_2 = doc_1.getElementsByTagName("ns1:item")[0]
doc_2 = doc_1.getElementsByTagName("ns1:Status")
for doc_3 in doc_2:
print (doc_3.childNodes[0].nodeValue)
print(len(doc_2))
Python reads all lines <ns1: Status> Registered </ ns1: Status>
It is necessary to count only in tags <ns1: CmDevices> <ns1: item> no deeper.
The correct value should be 2 not 4. bad result
How to do it?
This is best approached by using xpath and the lxml library, while paying atteention to namespaces:
from lxml import etree
doc = etree.parse("new.xml")
ns = {"ns1":"http://schemas.cisco.com/ast/soap"}
exp = '//ns1:Status[not(ancestor::*[preceding-sibling::ns1:Status])]'
stats = [stat for stat in doc.xpath(exp,namespaces=ns)]
print(len(stats))
Output:
2