Парсинг XML файла таблицы с передачей в DataFrame

Пытался получить адекватную таблицу из XML файла и передать ее в фрейм данных.

Как это сделать?

Пробовал парсить в Excel, но в Power Query криво кодировка считывается.

Сам файл по ссылке, там архив. Дайте совет, как лучше получить из него данные корректно.


Ответы (2 шт):

Автор решения: CrazyElf

Скорее всего вам поможет библиотека pandas-read-xml, но с ней придётся ещё поразбираться. Там есть примеры, в том числе есть готовый Google Colab.

Ну и нужно прочитать xml файл в кодировке cp1251, конечно.

Я набросал небольшой код, но дальше вам нужно будет самому углубляться в структуру XML, дальше у меня не получилось, нужно время и думать, пробовать:

#!pip install pandas_read_xml

import pandas_read_xml as pdx
filename = "/content/20200914_ED807_full.xml"

root_key_list = ['ED807', 'BICDirectoryEntry'] 

with open(filename, encoding='cp1251') as fd:
    df = pdx.read_xml(fd.read(), root_key_list)

#key_columns = ['BICDirectoryEntry|@BIC']

#data = df.pipe(pdx.auto_separate_tables, key_columns)

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

    @BIC        ParticipantInfo                    Accounts        SWBICS
0   041280103   {'@NameP': 'УФК по Астраханской области', '@Cn...   [{'@Account': '40116810100000010010', '@Regula...   NaN
1   044525597   {'@NameP': 'КУ "МИЛЛЕНИУМ БАНК" (ЗАО) - ГК "АС...   {'@Account': '30101810645250000597', '@Regulat...   NaN
→ Ссылка
Автор решения: MaxU

Воспользуйтесь данным решением (с) Austin Taylor:

import xml.etree.ElementTree as ET
import pandas as pd

class XML2DataFrame:

    def __init__(self, xml_data):
        self.root = ET.XML(xml_data)

    def parse_root(self, root):
        return [self.parse_element(child) for child in iter(root)]

    def parse_element(self, element, parsed=None):
        if parsed is None:
            parsed = dict()
        for key in element.keys():
            parsed[key] = element.attrib.get(key)
        if element.text:
            parsed[element.tag] = element.text
        for child in list(element):
            self.parse_element(child, parsed)
        return parsed

    def process_data(self):
        structure_data = self.parse_root(self.root)
        return pd.DataFrame(structure_data)

xml2df = XML2DataFrame(xml_data)
df = xml2df.process_data()

Пример:

with open(r"D:\download\20200915_ED807_full.xml") as f:
    xml_data = f.read()

xml2df = XML2DataFrame(xml_data)
df = xml2df.process_data()

результат:


In [32]: df
Out[32]:
            BIC                                    NameP CntrCd Rgn     Ind  ...        SWBIC DefaultSWBIC  \
0     041280103              УФК по Астраханской области     RU  12  414056  ...          NaN          NaN
1     044525597     КУ "МИЛЛЕНИУМ БАНК" (ЗАО) - ГК "АСВ"     RU  45  109240  ...          NaN          NaN
2     044525603          КУ ЗАО "ИПОТЕК БАНК" - ГК "АСВ"     RU  45  109240  ...          NaN          NaN
3     044525608        КУ ООО КБ "ДОРИС БАНК" - ГК "АСВ"     RU  45  109240  ...          NaN          NaN
4     044525652  КУ КБ "ПРИСКО КАПИТАЛ БАНК", АО - ГК...     RU  45  109240  ...          NaN          NaN
...         ...                                      ...    ...  ..     ...  ...          ...          ...
2368  298003187          Департамент финансов г. Якутска     RU  98  677000  ...          NaN          NaN
2369  015354008              УФК по Оренбургской области     RU  53  460014  ...          NaN          NaN
2370  200000099  Территориальная избирательная комисс...     RU  36  443110  ...          NaN          NaN
2371  200001413  Территориальная избирательная комисс...     RU  36  445011  ...          NaN          NaN
2372  047516949                          БАНК "КУБ" (АО)     RU  75  455044  ...  CRDURU4CXXX            1

                                     EnglName AccRstr AccRstrDate
0                                         NaN     NaN         NaN
1                                         NaN     NaN         NaN
2                                         NaN     NaN         NaN
3                                         NaN     NaN         NaN
4                                         NaN     NaN         NaN
...                                       ...     ...         ...
2368                                      NaN     NaN         NaN
2369                                      NaN     NaN         NaN
2370                                      NaN     NaN         NaN
2371                                      NaN     NaN         NaN
2372  "Credit Ural Bank" Joint Stock Compa...     NaN         NaN

[2373 rows x 28 columns]

столбцы DataFrame:

In [33]: df.columns
Out[33]:
Index(['BIC', 'NameP', 'CntrCd', 'Rgn', 'Ind', 'Tnp', 'Nnp', 'Adr', 'DateIn', 'PtType', 'Srvcs', 'XchType', 'UID',
       'ParticipantStatus', 'Account', 'RegulationAccountType', 'CK', 'AccountCBRBIC', 'AccountStatus', 'RegN', 'Rstr',
       'RstrDate', 'PrntBIC', 'SWBIC', 'DefaultSWBIC', 'EnglName', 'AccRstr', 'AccRstrDate'],
      dtype='object')

все значения первой строки фрейма:

In [34]: pd.set_option("display.max_rows", 30)

In [35]: df.iloc[0]
Out[35]:
BIC                                        041280103
NameP                    УФК по Астраханской области
CntrCd                                            RU
Rgn                                               12
Ind                                           414056
Tnp                                                г
Nnp                                        Астрахань
Adr                                 ул Латышева, 6 Г
DateIn                                    2013-01-09
PtType                                            52
Srvcs                                              3
XchType                                            1
UID                                       1280002005
ParticipantStatus                               PSAC
Account                         40116810600000010015
RegulationAccountType                           TRSA
CK                                                99
AccountCBRBIC                              041280002
AccountStatus                                   ACAC
RegN                                             NaN
Rstr                                             NaN
RstrDate                                         NaN
PrntBIC                                          NaN
SWBIC                                            NaN
DefaultSWBIC                                     NaN
EnglName                                         NaN
AccRstr                                          NaN
AccRstrDate                                      NaN
→ Ссылка