Python遍历XML匹配ID获取姓名时出现KeyError问题求助
问题排查与解决:根据ID从XML中查询人员姓名
需求
实现根据用户输入的ID(id_donne),在XML文件中查找对应<id_guy>标签的记录,输出该人员的姓名。
XML示例
<record><id_guy>1</id_guy><first_name>Homere</first_name><last_name>Latham</last_name></record>
原代码
xml_file = minidom.parse('id_guyy.xml') id_guys = xml_file.getElementsByTagName('id_guy') id_donne = int(input ("Please enter the person ID (maximum: 1000) > ")) for d in id_guys : if int(d.attributes['id_guy'].value) == id_donne : print('first name: ' + d.attributes['first_name'].value) print('last name: ' + d.attributes['last_name'].value) print('-------')
运行报错
if d.attributes['id_guy'].value == id_donne : File "C:\Program Files\Python310\lib\xml\dom\minidom.py", line 555, in __getitem__ return self._attrs[attname_or_tuple] KeyError: 'id_guy'
错误原因
你混淆了XML的标签内容和标签属性:
- 你的XML里,
<id_guy>1</id_guy>是独立的子标签,ID值是标签内的文本; - 但代码里用
d.attributes['id_guy']去查找,相当于在找类似<id_guy id_guy="1">这种不存在的属性,自然抛出KeyError。
另外,原代码遍历的是<id_guy>节点,没法直接关联到对应的姓名标签,逻辑本身存在问题。
修正后的代码
from xml.dom import minidom # 解析XML文件 xml_file = minidom.parse('id_guyy.xml') # 获取所有人员记录节点(<record>) records = xml_file.getElementsByTagName('record') id_donne = int(input("请输入人员ID(最大值:1000)> ")) for record in records: # 获取当前记录的ID标签,提取文本内容 id_tag = record.getElementsByTagName('id_guy')[0] current_id = int(id_tag.firstChild.data) if current_id == id_donne: # 提取姓名标签的文本内容 first_name = record.getElementsByTagName('first_name')[0].firstChild.data last_name = record.getElementsByTagName('last_name')[0].firstChild.data print(f'名字:{first_name}') print(f'姓氏:{last_name}') print('-------') # 找到匹配项后退出循环,提升效率 break else: # 循环未触发break,说明没有匹配的ID print(f'未找到ID为{id_donne}的人员记录')
关键修正点
- 补全
minidom模块的导入(原代码遗漏); - 改为遍历
<record>节点——这才是每条人员信息的完整容器; - 通过子标签获取内容:用
getElementsByTagName找到对应子标签后,用firstChild.data提取标签内的文本; - 增加未找到记录的提示逻辑;
- 找到匹配项后立即退出循环,避免不必要的遍历。
内容的提问来源于stack exchange,提问作者Aaron_23
相关产品推荐
相关产品推荐

