Доступ к безымянным тегам в подэлементах ElementTree - PullRequest
0 голосов
/ 14 января 2019

Я уже два дня читаю вопросы и примеры, но не повезло, поэтому думаю, что пришло время задать свой вопрос. У меня есть подмножество XML, с которым я работаю, прикреплено.

Я надеюсь получить значения для подэлементов <value><text></value></text>, но пока не могу этого сделать.

    #This is an example of the data retrieved via the REST call in my code.
    <results>
        <result offset='0'>
            <field k='_bkt'>
                <value><text>_internal~12~5A0B5349-F3B5-46CD-83E0-3816A0969D51</text></value>
            </field>
            <field k='_cd'>
                <value><text>12:241565</text></value>
            </field>
            <field k='_eventtype_color'>
                <value><text>none</text></value>
            </field>
            <field k='_indextime'>
                <value><text>1547138402</text></value>
            </field>
            <field k='_kv'>
                <value><text>1</text></value>
            </field>
        </result>
    </results>

    result = urllib2.urlopen(request)
    data = result.read()

    tree = ET.fromstring(results)

    for leaf in tree:
        #just a txt file to dump output to
        info_f.write("Row: " + leaf.get('offset') + "\n")
        fields = leaf.findall('field')
        for field in fields:
            if 'k' in field.attrib:
                key = field.get('k')
                info_f.write("    Key: " + key + "\n")

Приведенный выше код и данные примера правильно выводят смещение как '0' и правильно именованные теги, но я попытался несколько вещей, чтобы получить доступ к значениям подэлементов без удачи.

В идеале мой вывод будет выглядеть так:

    Offset: 0
    key: _indextime
    value: 1547138402
    etc...

Edit: я успешно получил доступ к элементам, используя getchildren () в следующем фрагменте кода, который устарел в новых версиях Python. Есть ли более дальновидный, элегантный подход?

    result = urllib2.urlopen(request)
    data = result.read()

    tree = ET.fromstring(results)

    for leaf in tree:
        #just a txt file to dump output to
        info_f.write("Row: " + leaf.get('offset') + "\n")
        fields = leaf.findall('field')
        for field in fields:
            if 'k' in field.attrib:
                key = field.get('k')
                info_f.write("    Key: " + key + "\n")

                values = field.getchildren()                    
                for v in values:
                    temp = v.getchildren()                        
                    for t in temp:
                        info_f.write("    value: " + t.text + "\n")

1 Ответ

0 голосов
/ 14 января 2019

Вы можете получить значения напрямую через findtext().

for field in fields:
    if 'k' in field.attrib:
        key = field.get('k')
        value = field.findtext("value/text")
        info_f.write("    Key: " + key + "\n")
        info_f.write("    value: " + value + "\n")
...