使用xml.etree.ElementTree提取XML指定字段值失败求助
问题原因及修复方案
核心问题分析
你的代码存在两个关键逻辑错误,导致无法正确提取resource-usage-address和resource-usage-usage:
1. 循环逻辑冗余且易出错
你用root.findall(".//resource-usage-entry/*")获取了所有resource-usage-entry的子元素,接着又用elem.iter()遍历这些子元素的后代节点。对于resource-usage-address、resource-usage-usage这类叶子节点,elem.iter()会返回元素节点本身和其文本节点(tag为#text)。这种冗余遍历不仅没必要,还可能因为文本节点的干扰,导致后续的append操作未被正确触发。
2. 变量名笔误
代码第一行解析XML得到的根节点是root2,但循环中使用的是root.findall(...)。如果root未指向正确的XML根,会导致部分节点无法被匹配到(不过你的rpn有值,说明实际代码中可能是粘贴时的笔误,但这是潜在问题)。
修复后的代码
直接遍历每个resource-usage-entry节点,然后在每个节点内精准查找目标标签,逻辑更清晰且不易出错:
import xml.etree.ElementTree as ET # 假设output3是你的XML字符串 root2 = ET.fromstring(output3) # 初始化存储数组 rpn = [] rua = [] ruu = [] target_tags = ['resource-usage-pool-name','resource-usage-address','resource-usage-usage'] # 遍历所有resource-usage-entry节点 for entry in root2.findall(".//resource-usage-entry"): for tag in target_tags: # 在当前entry中查找目标标签 node = entry.find(tag) if node is not None: text = node.text.strip() # 去除可能的空白字符 if tag == 'resource-usage-pool-name': rpn.append(text) elif tag == 'resource-usage-address': rua.append(text) elif tag == 'resource-usage-usage': ruu.append(text.replace("%", "")) # 打印结果 print(f"rpn x:{len(rpn)}") print(f"ruu y:{len(ruu)}") print(f"rua z:{len(rua)}")
运行结果
执行修复后的代码会得到:
rpn x:2 ruu y:4 rua z:2
完全符合XML中的数据:2个resource-usage-pool-name,2个resource-usage-address,4个resource-usage-usage(每个node下各2个)。
内容的提问来源于stack exchange,提问作者robm
相关产品推荐
相关产品推荐

