使用ElementTree获取同名标签的多个实例的子元素



我有一个像这样的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<data>
<boundary_conditions>
<rot>
<rot_instance>
<name>BC_1</name>
<rpm>200</rpm>
<parts>
<name>rim_FL</name>
<name>tire_FL</name>
<name>disk_FL</name>
<name>center_FL</name>
</parts>
</rot_instance>
<rot_instance>
<name>BC_2</name>
<rpm>100</rpm>
<parts>
<name>tire_FR</name>
<name>disk_FR</name>
</parts>
</rot_instance>
</data>

我实际上知道如何提取对应于每个实例的数据。因此,我可以对名称tag执行如下操作:

import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()
names= tree.findall('.//boundary_conditions/rot/rot_instance/name')
for val in names:
print(val.text)

得到:

BC_1
BC_2

但是如果我对parts标签做同样的事情:

names= tree.findall('.//boundary_conditions/rot/rot_instance/parts/name')
for val in names:
print(val.text)

它会给我:

rim_FL
tire_FL
disk_FL
center_FL
tire_FR
disk_FR

将部件/名称对应的所有数据组合在一起。我想要输出给我部分的元素为每个实例作为单独的列表。这就是我想要得到的:

instance_BC_1 = ['rim_FL', 'tire_FL', 'disk_FL', 'center_FL']
instance_BC_2 = ['tire_FR', 'disk_FR']

感谢任何帮助,谢谢。

您必须首先找到所有parts元素,然后从每个parts元素中找到所有name标签。

看一看:

parts = tree.findall('.//boundary_conditions/rot/rot_instance/parts')
for part in parts:
for val in part.findall("name"):
print(val.text)

print()

instance_BC_1 = [val.text for val in parts[0].findall("name")]
instance_BC_2 = [val.text for val in parts[1].findall("name")]
print(instance_BC_1)
print(instance_BC_2)

输出:

rim_FL
tire_FL
disk_FL
center_FL
tire_FR
disk_FR
['rim_FL', 'tire_FL', 'disk_FL', 'center_FL']
['tire_FR', 'disk_FR']