Python XML:循环遍历子项以获取每个子项的分隔值



我有这个 xml 文件:

<SESSION_INFO>
<start_time>2018-10-16 22:44:38.36 -0500</start_time>
</SESSION_INFO>
<ALL_INSTANCES>
<instance>
<ID>1</ID>
<start>4.3974745990</start>
<end>13.6332131403</end>
<code>Button 013</code>
<label>
<text>1,2</text>
</label>
<label>
<text>0,4</text>
</label>
<label>
<text>2,3</text>
</label>
</instance>
<instance>
<ID>2</ID>
<start>513.0491021980</start>
<end>524.9834182373</end>
<code>Button 013</code>
<label>
<text>1,2</text>
</label>
<label>
<text>1,4</text>
</label>
<label>
<text>1,3</text>
</label>
<label>
<text>0,1</text>
</label>
<label>
<text>1,3</text>
</label>
<label>
<text>0,4</text>
</label>
</instance>
</ALL_INSTANCES>

我写了一个代码来从/label/text 中提取所有数据并将其放在一个列表中:

import xml.etree.ElementTree as ET
tree= ET.parse('/Desktop/XML Edit list.xml')
root = tree.getroot()
labels = []
for each in root.findall('.//ALL_INSTANCES/instance/label'):
rating = each.find('.//text');
print 'Empity' if rating is None else labels.append(rating.text);
print(labels)

下一步,我无法理解它,是为每个实例中的所有 创建一个列表(在本例中为 2(。现在,我觉得我需要使用 for 循环进入每个,提取数据并写入将附加到标签 [] 的列表。 但是,我不能分别浏览每个实例;.find 和 .get 循环并没有让我走得更远......这是我最好的镜头。

提前感谢您的帮助, 克罗诺斯

编辑 1根据请求添加理想输出:

[['1,2', '0,4', '2,3'], ['1,2', '1,4', '1,3', '0,1', '1,3', '0,4']]

编辑 2之前,我已经实现了这个目标,在循环中添加了另一个列表,该列表将首先附加到all_lables,然后重置以获取下一个实例的其他值。像这样:

all_labels = []
result = []
for child in root.iter():
for instance in child.findall('instance'):
for label in instance.findall('label'):
all_labels = []
for val in label.findall('text'):
all_labels.append(val.text)
result.append(all_labels)

但我不能让它工作

编辑 3几乎明白了,感谢 LeKhan9 展示了一种更简单的方法; 根据他的想法,我创建了另一个列表,该列表将保存每个循环的结果; 输出包含一个空值,因此它不是"干净的":

all_labels = []
result = []
for child in root.iter():    
for instance in child.findall('instance'):        
result.append(all_labels)    
all_labels = []
for label in instance.findall('label'):            
for val in label.findall('text'):
all_labels.append(val.text)
result.append(all_labels)
print result
[[], ['1,2', '0,4', '2,3'], ['1,2', '1,4', '1,3', '0,1', '1,3', '0,4']]

您始终可以采用深思熟虑的方法,并按如下方式解析树的每个级别:

from xml.etree import ElementTree as ET

tree = ET.parse('test.xml')
root = tree.getroot()
all_labels = []
for child in root.iter():
for instance in child.findall('instance'):
for label in instance.findall('label'):
for val in label.findall('text'):
all_labels.append(val.text)
print all_labels

输出:

['1,2', '0,4', '2,3', '1,2', '1,4', '1,3', '0,1', '1,3', '0,4']

根据 OP 预期输出进行更新:

from xml.etree import ElementTree as ET

tree = ET.parse('test.xml')
root = tree.getroot()
result = []
for child in root.iter():
for instance in child.findall('instance'):
current_labels = []
for label in instance.findall('label'):
for val in label.findall('text'):
current_labels.append(val.text)
result.append(current_labels)
print result

输出:

[['1,2', '0,4', '2,3'], ['1,2', '1,4', '1,3', '0,1', '1,3', '0,4']]

最新更新