pythonxml:遍历子对象以获得每个子对象的独立值

2024-03-28 08:15:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个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 and .get循环没有让我走得更远。。。这是我最好的机会。你知道吗

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

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

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

编辑2 在此之前,我已经在循环中添加了另一个列表,该列表将首先附加到所有的标签上,然后重置以获取下一个实例的其他值。比如:

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

Tags: instancetextinid列表forlabelscode
1条回答
网友
1楼 · 发布于 2024-03-28 08:15:17

您可以始终采取审慎的方法,并将树的每一层都解析为:

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

基于OPs预期输出进行更新:

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

相关问题 更多 >