如何使用Python的minidom准确统计<ns1:CmDevices>下直接<ns1:item>节点中<ns1:Status>为Registered的数量
解决minidom统计SOAP XML中指定层级Status节点的问题
我懂你的痛点——现在的代码会把所有层级的<ns1:Status>都捞出来,连<ns1:LinesStatus>子节点里的也算进去,所以统计出4个,但你真正要的是<ns1:CmDevices>下每个设备item直接包含的那个Status节点,对吧?
问题根源
原代码里的doc_1.getElementsByTagName("ns1:Status")是递归查找的,会获取<ns1:CmDevices>节点下所有后代中的<ns1:Status>,包括嵌套在<ns1:LinesStatus>里的那两个,这就导致统计结果翻倍了。
修正后的代码方案
我们需要调整逻辑:先拿到每个设备的item节点,再只找这个item的直接子节点中的<ns1:Status>,而不是递归找所有后代。
from xml.dom import minidom # 解析XML文件 doc = minidom.parse('new.xml') # 获取<ns1:CmDevices>节点 cm_devices_node = doc.getElementsByTagName("ns1:CmDevices")[0] # 获取该节点下所有的设备item(也就是每个设备对应的<ns1:item>) device_items = cm_devices_node.getElementsByTagName("ns1:item") registered_device_count = 0 # 遍历每个设备item for device_item in device_items: # 遍历当前item的直接子节点,筛选出<ns1:Status> for child_node in device_item.childNodes: # 只处理元素节点,并且标签名是ns1:Status if child_node.nodeType == minidom.Node.ELEMENT_NODE and child_node.tagName == "ns1:Status": status_value = child_node.firstChild.nodeValue.strip() print(status_value) if status_value == "Registered": registered_device_count += 1 # 输出正确的统计结果 print(f"已注册的设备数量: {registered_device_count}")
代码说明
- 先定位到
<ns1:CmDevices>节点,再获取它下面所有的设备item节点,这是我们要处理的目标层级 - 遍历每个设备item时,不再用
getElementsByTagName(因为会递归),而是直接遍历item的childNodes,只筛选直接子节点中的<ns1:Status> - 对每个符合条件的Status节点,判断值是否为
Registered并计数
这样运行后,统计结果就是正确的2,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Adio
相关产品推荐
相关产品推荐

