Python XML:遍历子级以获得每个子级的单独值

时间:2018-10-17 04:42:22

标签: 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循环进入每个循环,提取数据并写入一个列表,该列表将附加到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']]

1 个答案:

答案 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']]