[英]How do I make a loop that gives unique values as output for XML with Elementtree in python?
I want to create a list with all the id's/attribute values of an element based on conditions in subelements.我想根据子元素中的条件创建一个包含元素的所有 id/属性值的列表。 When making the loop, the output is a list with the attribute value (id) for every subelement.在进行循环时,output 是一个列表,其中包含每个子元素的属性值 (id)。 Here, I just need the attribute value (id) in the element 'playevent' once for every parent element.在这里,对于每个父元素,我只需要元素“playevent”中的属性值(id)一次。
Here is a part of the XML file:这是 XML 文件的一部分:
</file>
<ALL_INSTANCES>
<playerevent id="1">
<starttime></starttime>
<endtime></endtime>
<player>/player>
<quarter></quarter>
<result>
<kind number="1"></kind>
<means number="1"></means>
</result>
</playerevent>
<playevent id="2" type=">
<starttime></starttime>
<endtime></endtime>
<zone></zone>
<label>
<group></group>
<text>/text>
</label>
<label>
<group></group>
<text></text>
</label>
<label>
<text></text>
</label>
<label>
<group></group>
<text></text>
</label>
<score team=""></score>
<score team=""></score>
<label>
<text></text>
</label>
<team></team>
</playevent>
Edit: This is another element with subelement 'playevent'
<playevent id="10" type="">
<starttime></starttime>
<endtime></endtime>
<zone></zone>
<label>
<group></group>
<text></text>
</label>
<label>
<group></group>
<text></text>
</label>
<label>
<group>/group>
<text></text>
</label>
<label>
<text></text>
</label>
<score team=""></score>
<score team=""></score>
<previousevent>
</previousevent>
<label>
<text></text>
</label>
<label>
<text></text>
</label>
<team></team>
</playevent>
I have tried multiple solutions like creating a functions that give the unique values in a list.我尝试了多种解决方案,例如创建一个在列表中提供唯一值的函数。 I have tried.findall() to change the loop.我试过 .findall() 来改变循环。 But all the outcomes are the same.但所有的结果都是一样的。
for subelem1 in elem:
for subelem2 in subelem1:
for subelem2 in subelem1.findall('previousevent'):
if subelem2.tag == 'previousevent':
list = subelem1.get('id')
print(list)
Current output: 2 2 2 2 2 2 2 2 2 2 2 2当前 output:2 2 2 2 2 2 2 2 2 2 2
Expected output: 2预期 output:2
You can just use a "predicate" expression [previousevent]
with findall
:您可以将“谓词”表达式[previousevent]
与findall
一起使用:
for playevent in tree.findall('.//playevent[previousevent]'):
print(playevent.get('id'))
So所以
import xml.etree.ElementTree as ET
xml = '''
<ALL_INSTANCES>
<playevent id="1">
<foo>..</foo>
<bar>..</bar>
</playevent>
<playevent id="2">
<foo>..</foo>
<bar>..</bar>
<previousevent></previousevent>
<baz>..</baz>
</playevent>
<playevent id="3">
<foo>..</foo>
<bar>..</bar>
</playevent>
<playevent id="4">
<foo>..</foo>
<bar>..</bar>
<previousevent></previousevent>
<baz>..</baz>
</playevent>
</ALL_INSTANCES>
'''
tree = ET.fromstring(xml)
for playevent in tree.findall('.//playevent[previousevent]'):
print(playevent.get('id'))
outputs输出
2
4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.