在 Python 中使用 minidom 计算 <ns1: Status> 标记中的“已注册”行数

Posted

技术标签:

【中文标题】在 Python 中使用 minidom 计算 <ns1: Status> 标记中的“已注册”行数【英文标题】:Counting the number of "Registered" lines in the <ns1: Status> tag using minidom in Python 【发布时间】:2021-12-06 09:41:46 【问题描述】:

Python 读取所有行 Registered Status>

只需要在标签中计数 没有更深。

正确的值应该是 2 而不是 4。 bad result

怎么做?

原始 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>

我的 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 读取所有行 Registered Status>

只需要在标签中计数 没有更深。

正确的值应该是 2 而不是 4。 bad result

怎么做?

【问题讨论】:

您问题中的“原始 xml”并不是真正的原始 xml;它缺少命名空间声明。您可以编辑您的问题并确保 xml 格式正确吗? 固定,替换 xml 【参考方案1】:

最好使用 xpath 和 lxml 库来解决这个问题,同时注意命名空间:

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))

输出:

2

【讨论】:

以上是关于在 Python 中使用 minidom 计算 <ns1: Status> 标记中的“已注册”行数的主要内容,如果未能解决你的问题,请参考以下文章

python xml.dom.minidom.parse

python Python.XML.Minidom

python Python.XML.Minidom

Python minidom模块(DOM写入和解析XML)

Python基于 DOM 的 XML 文档解析(xml.dom.minidom)

Python:minidom模块(DOM写入和解析XML)