简体   繁体   English

如何使用 python 中的 Elementtree 创建一个循环,为 XML 提供唯一值作为 output 的循环?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM