使用xml.etree.ElementTree提取XML中pool_192_168_1_值失败求助
XML资源池名称提取失败的问题排查与解决
问题场景
现有如下XML结构:
<multi-routing-engine-results> <multi-routing-engine-item> <re-name>node0</re-name> <source-resource-usage-pool-information> <resource-usage-entry style="all-pat-pool"> <resource-usage-pool-name>pool_192_168_1_113</resource-usage-pool-name> <resource-usage-total-pool-num>57</resource-usage-total-pool-num> <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor> <resource-usage-peak-usage>21%</resource-usage-peak-usage> <resource-usage-peak-date-time seconds="1736272550">2025-01-07 11:55:50 CST</resource-usage-peak-date-time> <resource-usage-total-address>1</resource-usage-total-address> <resource-usage-total-used>7741</resource-usage-total-used> <resource-usage-total-avail>56771</resource-usage-total-avail> <resource-usage-total-total>64512</resource-usage-total-total> <resource-usage-total-usage>11%</resource-usage-total-usage> </resource-usage-entry> <resource-usage-entry style="all-pat-pool"> <resource-usage-pool-name>pool_192_168_1_114</resource-usage-pool-name> <resource-usage-total-pool-num>57</resource-usage-total-pool-num> <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor> <resource-usage-peak-usage>8%</resource-usage-peak-usage> <resource-usage-peak-date-time seconds="1734024324">2024-12-12 11:25:24 CST</resource-usage-peak-date-time> <resource-usage-total-address>1</resource-usage-total-address> <resource-usage-total-used>2520</resource-usage-total-used> <resource-usage-total-avail>61992</resource-usage-total-avail> <resource-usage-total-total>64512</resource-usage-total-total> <resource-usage-total-usage>3%</resource-usage-total-usage> </resource-usage-entry> <resource-usage-entry style="all-pat-pool"> <resource-usage-pool-name>gos_src_pool_207_195_114_101</resource-usage-pool-name> <resource-usage-total-pool-num>57</resource-usage-total-pool-num> <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor> <resource-usage-peak-usage>32%</resource-usage-peak-usage> <resource-usage-peak-date-time seconds="1733419670">2024-12-05 11:27:50 CST</resource-usage-peak-date-time> <resource-usage-total-address>1</resource-usage-total-address> <resource-usage-total-used>15115</resource-usage-total-used> <resource-usage-total-avail>49397</resource-usage-total-avail> <resource-usage-total-total>64512</resource-usage-total-total> <resource-usage-total-usage>23%</resource-usage-total-usage> </resource-usage-entry> <resource-usage-entry style="all-pat-pool"> <resource-usage-pool-name>gos_src_pool_207_195_114_103</resource-usage-pool-name> <resource-usage-total-pool-num>57</resource-usage-total-pool-num> <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor> <resource-usage-peak-usage>19%</resource-usage-peak-usage> <resource-usage-peak-date-time seconds="1739283197">2025-02-11 08:13:17 CST</resource-usage-peak-date-time> <resource-usage-total-address>1</resource-usage-total-address> <resource-usage-total-used>7920</resource-usage-total-used> <resource-usage-total-avail>56592</resource-usage-total-avail> <resource-usage-total-total>64512</resource-usage-total-total> <resource-usage-total-usage>12%</resource-usage-total-usage> </resource-usage-entry> </source-resource-usage-pool-information> </multi-routing-engine-item> </multi-routing-engine-results>
尝试提取所有以pool_192_168_1_开头的资源池名称,但执行以下代码后无任何结果:
outputxml1 = etree.tostring(rpc_xml, encoding='unicode') root = ET.fromstring(outputxml1) x = 1 for item in root.findall('./multi-routing-engine-results/multi-routing-engine-item/re-name/source-resource-usage-pool-information/resource-usage-pool-name'): print(str(item)) x = x + 1
问题分析
代码存在三个核心错误:
- XPath路径错误:
root已经是<multi-routing-engine-results>节点,路径开头的./multi-routing-engine-results/属于重复指定根节点;同时<source-resource-usage-pool-information>与<re-name>是同级节点,原路径错误地将其作为<re-name>的子节点查找,完全不符合XML层级结构。 - 未过滤目标前缀:代码仅查找所有
resource-usage-pool-name节点,没有筛选出以pool_192_168_1_开头的名称。 - 打印内容错误:
str(item)输出的是节点对象的字符串表示,而非节点内的文本内容,即使路径正确也无法得到实际池名称。
修正后的代码
import xml.etree.ElementTree as ET # 假设rpc_xml是已有的XML对象 outputxml1 = etree.tostring(rpc_xml, encoding='unicode') root = ET.fromstring(outputxml1) # 修正后的XPath路径,匹配正确层级 pool_names = root.findall('./multi-routing-engine-item/source-resource-usage-pool-information/resource-usage-entry/resource-usage-pool-name') x = 1 for item in pool_names: pool_name = item.text # 过滤目标前缀的资源池名称 if pool_name.startswith('pool_192_168_1_'): print(pool_name) x += 1
关键修正点
- 调整XPath路径为
./multi-routing-engine-item/source-resource-usage-pool-information/resource-usage-entry/resource-usage-pool-name,对应XML的实际层级。 - 使用
item.text获取节点的文本内容,即真实的资源池名称。 - 添加
startswith('pool_192_168_1_')条件,筛选出目标资源池。
内容的提问来源于stack exchange,提问作者robm
相关产品推荐
相关产品推荐

