Конвертировать XML в список словарей в python - PullRequest
0 голосов
/ 23 марта 2020

Я очень новичок в python и, пожалуйста, относитесь ко мне так же. Когда я пытался преобразовать содержимое XML в Список словарей, я получал вывод, но не так, как ожидалось, и много пытался поиграться.

XML Содержимое:

<project>
    <panelists>
        <panelist panelist_login="pradeep">
            <login/>
            <firstname/>
            <lastname/>
            <gender/>
            <age>0</age>
        </panelist>
        <panelist panelist_login="kumar">
            <login>kumar</login>
            <firstname>kumar</firstname>
            <lastname>Pradeep</lastname>
            <gender/>
            <age>24</age>
        </panelist>
    </panelists>
</project>

Код, который я использовал:

import xml.etree.ElementTree as ET

tree = ET.parse(xml_file.xml)   # import xml from
root = tree.getroot()  

Panelist_list = []

for item in root.findall('./panelists/panelist'):    # find all projects node
    Panelist = {}              # dictionary to store content of each projects
    panelist_login = {}
    panelist_login = item.attrib
    Panelist_list.append(panelist_login)
    for child in item:

      Panelist[child.tag] = child.text

    Panelist_list.append(Panelist)

print(Panelist_list)

Вывод:

[{
  'panelist_login': 'pradeep'
}, {
  'login': None,
  'firstname': None,
  'lastname': None,
  'gender': None,
  'age': '0'
}, {
  'panelist_login': 'kumar'
}, {
  'login': 'kumar',
  'firstname': 'kumar',
  'lastname': 'Pradeep',
  'gender': None,
  'age': '24'
}]

, и я ожидаю нижеследующего вывода

[{
  'panelist_login': 'pradeep',
  'login': None,
  'firstname': None,
  'lastname': None,
  'gender': None,
  'age': '0'
}, {
  'panelist_login': 'kumar'
  'login': 'kumar',
  'firstname': 'kumar',
  'lastname': 'Pradeep',
  'gender': None,
  'age': '24'
}]

Я сослался на переполнение стека вопросы по xml дереву, но все равно не помогли мне.

любая помощь / предложение приветствуется.

1 Ответ

0 голосов
/ 23 марта 2020

Ваш код добавляет к списку слова dict panelist_login с атрибутами тега в этой строке: Panelist_list.append(panelist_login) отдельно из указания Panelist. Таким образом, к каждому тегу <panelist> к коду добавляется 2 дикта: один дикт для атрибутов тега и один дикт для subtags Внутри l oop у вас есть 2 append() вызовов, что означает 2 элемента в списке каждый раз через l oop.

Но на самом деле вы хотите, чтобы по одному тегу для каждого тега <panelist>, и вы хотели, чтобы атрибут тега отображался внутри диктанта Panelist, как если бы он был также подтэгом.

Таким образом, у вас есть один dict и обновите Panelist dict с атрибутами тега вместо того, чтобы хранить атрибуты tag в отдельном dict.

for item in root.findall('./panelists/panelist'):    # find all projects node
    Panelist = {}              # dictionary to store content of each projects
    panelist_login = item.attrib
    Panelist.update(panelist_login) # make panelist_login the first key of the dict
    for child in item:
      Panelist[child.tag] = child.text
    Panelist_list.append(Panelist)
print(Panelist_list)

Я получаю этот вывод, который я думаю, что вы имели в виду:

[
  {'panelist_login': 'pradeep', 
  'login': None, 
  'firstname': None, 
  'lastname': None, 
  'gender': None, 
  'age': '0'}, 
  {'panelist_login': 'kumar', 
  'login': 'kumar', 
  'firstname': 'kumar', 
  'lastname': 'Pradeep', 
  'gender': None, 
  'age': '24'}
 ]
...