簡體   English   中英

如何使用 python 中的 Elementtree 創建一個循環,為 XML 提供唯一值作為 output 的循環?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM