我有这个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循环进入每个循环,提取数据并写入一个列表,该列表将附加到labels []上。 但是,我不能单独遍历每个实例。 .find and .get循环并没有给我带来任何帮助...这是我的最佳镜头。
预先感谢您的帮助, 克朗诺斯(Cronos)
编辑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)
但是我无法使其正常工作
EDIT 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']]
答案 0 :(得分:1)
您始终可以采用有意识的方法,并按如下方式解析树的每个级别:
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']]