[英]How do I make a loop that gives unique values as output for XML with Elementtree in python?
我想根據子元素中的條件創建一個包含元素的所有 id/屬性值的列表。 在進行循環時,output 是一個列表,其中包含每個子元素的屬性值 (id)。 在這里,對於每個父元素,我只需要元素“playevent”中的屬性值(id)一次。
這是 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>
我嘗試了多種解決方案,例如創建一個在列表中提供唯一值的函數。 我試過 .findall() 來改變循環。 但所有的結果都是一樣的。
for subelem1 in elem:
for subelem2 in subelem1:
for subelem2 in subelem1.findall('previousevent'):
if subelem2.tag == 'previousevent':
list = subelem1.get('id')
print(list)
當前 output:2 2 2 2 2 2 2 2 2 2 2
預期 output:2
您可以將“謂詞”表達式[previousevent]
與findall
一起使用:
for playevent in tree.findall('.//playevent[previousevent]'):
print(playevent.get('id'))
所以
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'))
輸出
2
4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.