使用ElementTree提取XML同名标签多实例的分组子元素
XML按实例分组提取子节点实现方案
问题原因
直接使用XPath .//boundary_conditions/rot/rot_instance/parts/name 全局匹配时,会一次性拿到文档中所有符合路径规则的name节点,丢失了节点所属的上层rot_instance关联关系,所以无法区分每个部件属于哪个边界条件实例。
解决逻辑
调整查询顺序,分层处理:
- 第一步:先匹配所有独立的
rot_instance节点,每个节点对应一个边界条件实例 - 第二步:遍历每个实例节点,在当前节点的上下文范围内,单独提取实例名称、转速、下属部件列表等属性,自然完成数据分组,不会出现跨实例数据混淆
实现代码
import xml.etree.ElementTree as ET tree = ET.parse('file.xml') root = tree.getroot() # 获取所有旋转边界条件实例节点 rot_instance_list = root.findall('.//boundary_conditions/rot/rot_instance') for instance in rot_instance_list: # 提取当前实例的名称 bc_name = instance.find('name').text # 提取当前实例下绑定的所有部件名称 part_list = [part_node.text for part_node in instance.findall('./parts/name')] # 按预期格式输出结果 print(f"instance_{bc_name} = {part_list}")
运行结果
执行上述代码后将输出完全符合预期的分组结果:
instance_BC_1 = ['rim_FL', 'tire_FL', 'disk_FL', 'center_FL'] instance_BC_2 = ['tire_FR', 'disk_FR']
扩展提示:如果后续需要提取每个实例的转速参数,直接在遍历单个实例时用
instance.find('rpm').text即可获取,同样不会出现数据串扰的问题。
内容的提问来源于stack exchange,提问作者Mojtaba
相关产品推荐
相关产品推荐

