Преобразование данных XML в список словарей для загрузки в таблицы - PullRequest
0 голосов
/ 11 ноября 2019

Я написал код для преобразования данных xml в список словарей и загрузки в таблицы.

Данные входного файла:

<report>
    <report_header type='comp1'  title='industry' year='2019' />
        <report_body age='21'>
        <Prod name='krishna' id='11' place='usa'>
            <License state='aus' area= 'street1'>
            </License>
            <License state='mus' area= 'street2'>
            </License>
            <License state='mukin' area= 'street3'>
            </License>
        </Prod>
        <Prod name='ram' id='12' place='uk'>
            <License state='junej' area= 'street4'>
            </License>
            <License state='rand' area= 'street5'>
            </License>
            <License state='gandhi' area= 'street6'>
            </License>
        </Prod>
        <Prod name='chand' id='13' place='london'>
            <License state='nehru' area= 'street7'>
            </License>
            <License state='mahatma' area= 'street8'>
            </License>
            <License state='park' area= 'street9'>
            </License>
        </Prod>
    </report_body>
 </report>  

Код:

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root = tree.getroot()
way_list=[]
for item in root.iter():
  way_list.append(dict(item.attrib))
for k, v in [(k, v) for x in way_list for (k, v) in x.items()]:
  print(k,v)

вывод: тип comp1

название отрасли

год 2019

возраст 21

имя Кришна

идентификатор 11

место США

штат Aus

район улица1

штат муз

область улица2

штат Мукин

область улица3

имя оперативной памяти

идентификатор 12

место Великобритании

штатиюнь

область улица4

штат Рэнд

область улица 5

штат Ганди

область улица6

имя чанд

id 13

место лондон

штат Неру

район улица 7

штат Махатма

район улица8

государственный парк

площадь улицы9

Ожидаемый результат: [{type: 'comp1', название: 'industry', год: 2019, возраст: 21 год, имя: «Кришна», id: 11, место: «США», штат: «aus», площадь: «улица1»}, {тип: «comp1», название: «отрасль», год:2019, возраст: 21 год, имя: «Кришна», id: 11, место: «США», штат: «mus», район: «улица2»}, {тип: «comp1», название: «промышленность», год:2019, возраст: 21 год, имя: «Кришна», id: 11, место: «США», штат: «мускин», площадь: «улица3»}, {тип: «comp1», название: «промышленность», год:2019, возраст: 21 год, имя: «ram», id: 12, место: «uk», штат: «junej», площадь: «street4»}, {тип: «comp1», название: «отрасль», год:2019, возраст: 21 год, имя: «ram», id: 12, место: «uk», штат: «rand», площадь: «street5»}, ......... и т. Д.]

Моя главная цель - загрузить данные в таблицу, как показано ниже:

тип, название, год, имя, идентификатор, место, штат, область

comp1, отрасль, 2019, Кришна, 11, США, AUS, улица 1

comp1, промышленность, 2019, Кришна, 11, США, Муз, улица2

comp1, промышленность, 2019, Кришна, 11, США, muskin, street3

comp1, индустрия, 2019, ram, 12, Великобритания, junej, street4

comp1, индустрия, 2019, ram, 12, Великобритания, rand, street5

comp1, промышленность, 2019, овен, 12, Великобритания, ганди, street6

Теперь я могу конвертировать данные в список словарей.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

используя просто ElementTree.

import xml.etree.ElementTree as ET

tree = ET.parse('sample.xml')
root = tree.getroot()
dict_rep= root.find('report_header').attrib
dict_rep.update(root.find('report_body').attrib)
way_list=[]
for prod in root.iter('Prod'):
  dict_line = dict_rep
  dict_line.update(prod.attrib)
  for lic in prod.iter('License'):
    dict_line.update(lic.attrib)
    print(dict_line)
    way_list.append(dict_line)
0 голосов
/ 11 ноября 2019

Вот один из способов. Читайте о CSV-модуле .

import csv, os, sys, io
from xml.etree import ElementTree

data = """\
<report>
<report_header type='comp1'  title='industry' year='2019' />
    <report_body>
    <Prod name='krishna' id='11' place='usa'>
        <License state='aus' area= 'street1'>
        </License>
        <License state='mus' area= 'street2'>
        </License>
        <License state='mukin' area= 'street3'>
        </License>
    </Prod>
    <Prod name='ram' id='12' place='uk'>
        <License state='junej' area= 'street4'>
        </License>
        <License state='rand' area= 'street5'>
        </License>
        <License state='gandhi' area= 'street6'>
        </License>
    </Prod>
    <Prod name='chand' id='13' place='london'>
        <License state='nehru' area= 'street7'>
        </License>
        <License state='mahatma' area= 'street8'>
        </License>
        <License state='park' area= 'street9'>
        </License>
    </Prod>
</report_body>
</report>
"""

fieldnames = ['type', 'title', 'year', 'name', 'id', 'place', 'state', 'area']
writer = csv.DictWriter(sys.stdout, fieldnames=fieldnames)
writer.writeheader()
tree = ElementTree.parse(io.StringIO(data))
report_header = tree.find('report_header')
report_body = tree.find('report_body')
for Prod in report_body.findall('Prod'):
    for License in Prod.findall('License'):
        d = {}
        d.update(License.attrib)
        d.update(Prod.attrib)
        d.update(report_header.attrib)
        writer.writerow(d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...