Python中使用ElementTree如何获取XML嵌套元素的指定属性值
精准提取嵌套XML节点指定属性的实现方式
无需通过全量递归遍历所有节点的方式获取属性,直接借助ElementTree内置的节点路径匹配能力,定位目标节点后读取对应属性即可完成操作。
操作思路
- 全量递归的
root.iter()方法会无差别扫描XML所有层级的子节点,输出全部节点的标签与属性,不符合精准定位的需求 - 改用
find()/findall()方法按照XML的层级路径定向匹配目标节点:find('相对节点路径'):返回路径匹配的第一个节点对象findall('相对节点路径'):返回路径匹配的所有节点对象组成的列表
- 定位到目标节点后,调用节点对象的
.get('属性名')方法读取属性值:相比直接访问节点对象.attrib['属性名']的写法,该方法支持自定义默认返回值,可避免属性不存在时触发KeyError异常
代码示例
以提取SCHOOL节点下的NAME属性值为例:
import xml.etree.ElementTree as ET # 解析XML文件 parsed_xml = ET.parse('test.xml') root = parsed_xml.getroot() # 按节点层级定位SCHOOL节点(SCHOOL为根节点的直接子节点) school_node = root.find('SCHOOL') # 读取SCHOOL节点的NAME属性值 school_name = school_node.get('NAME') print(school_name) # 输出结果:DPS
深层嵌套节点的匹配方法
如果需要提取多层嵌套下的节点属性(比如路径为根节点 > MED > PATIENT的PATIENT节点的ID属性),仅需要在路径参数中写全层级关系,不需要逐节点跳转遍历:
# 定位MED节点下属的PATIENT节点 patient_node = root.find('MED/PATIENT') # 读取PATIENT节点的ID属性 patient_id = patient_node.get('ID') print(patient_id) # 输出结果:10101022
注意要点
- 若XML文件存在命名空间,需要在路径匹配规则中显式包含命名空间标识,否则无法正常定位节点
- 当目标节点不存在时,
find()方法会返回None,建议在读取属性前增加空值判断,避免触发空对象操作异常
内容的提问来源于stack exchange,提问作者Bogota
相关产品推荐
相关产品推荐

