You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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}")

代码说明

  1. 先定位到<ns1:CmDevices>节点,再获取它下面所有的设备item节点,这是我们要处理的目标层级
  2. 遍历每个设备item时,不再用getElementsByTagName(因为会递归),而是直接遍历item的childNodes,只筛选直接子节点中的<ns1:Status>
  3. 对每个符合条件的Status节点,判断值是否为Registered并计数

这样运行后,统计结果就是正确的2,完美匹配你的需求。

内容的提问来源于stack exchange,提问作者Adio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:47:51