<avis>
<numeroseao>1331795</numeroseao>
<numero>61628-3435560</numero>
<organisme>Ville de Québec</organisme>
<fournisseurs>
  <fournisseur>
    <nomorganisation>APEL ASSOCIATION POUT DU LA MARAISNORD</nomorganisation>
    <adjudicataire>1</adjudicataire>
    <montantsoumis>0.000000</montantsoumis>
    <montantssoumisunite>0</montantssoumisunite>
    <montantcontrat>89732.240000</montantcontrat>
    <montanttotalcontrat>0.000000</montanttotalcontrat>
  </fournisseur>
</fournisseurs>
</avis>

Итак, есть avis, у avis есть четверки, у четвернишек есть дополнительные узлы. Как мне передать эти значения во фрейм данных?

Я использую приведенный ниже код

element_tree = ET.parse('D:\\python_script\\temp2\\AvisRevisions_20200201_20200229.xml')
root = element_tree.getroot()
for child in root.findall('.//avis/*/*/*'):

Или

for child in root.findall('.//avis/*'):

Но он получает только родительские узлы или дочерние узлы, а не все из них.

0
Jibran Karim 27 Ноя 2021 в 20:17
"но он получает только родительские узлы или дочерние узлы, а не все из них". Я заметил, что вы пробовали './/avis/*' (с одним /*) и './/avis/*/*/*' (с тремя /*). Может быть, вы можете придумать альтернативу, которая находится между этими двумя? Вы пробовали это?
 – 
Karl Knechtel
27 Ноя 2021 в 21:01
Добро пожаловать в Stack Overflow. Попробуйте создать stackoverflow.com/help/minimal-reproducible-example. Если вы используете Pandas, вам следует пометить это, и вы должны показать код, который вы используете внутри цикла, чтобы попытаться создать Dataframe, о котором вы упомянули. Мне непонятно, зачем вы вообще пишете цикл, если вы хотите создать только один Dataframe.
 – 
Karl Knechtel
27 Ноя 2021 в 21:02

2 ответа

Лучший ответ

Поскольку ваши данные не плоские, это может вызвать проблемы при импорте xml непосредственно в pandas. В этом случае может быть полезна библиотека типа pandas_read_xml:

import pandas_read_xml as pdx

df = pdx.read_xml(xml)
df = pdx.fully_flatten(df)  # this should get you the structure you want

В строке выше переменная xml - это ваш файл «AvisRevisions_20200201_20200229.xml».


Для более плоской структуры вы можете использовать Панды как таковые:

import pandas as pd

df = pd.read_xml(xml, xpath="//fournisseurs")

Если вы ищете весь раздел avis, вы можете заменить параметр xpath на:

df = pd.read_xml(xml, xpath="//avis")

Исходя из этого, pandas должен создать фрейм данных с соответствующими столбцами. Вот ссылка на документы Pandas.

1
Fredaroo 27 Ноя 2021 в 22:19
Вы любите жизнь, братан. Некоторое время я бездельничал и чувствовал себя безнадежным. Это именно то, что я хотел.
 – 
Jibran Karim
27 Ноя 2021 в 23:22

Попробуйте следующее

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

xml = '''<avis>
<numeroseao>1331795</numeroseao>
<numero>61628-3435560</numero>
<organisme>Ville de Québec</organisme>
<fournisseurs>
  <fournisseur>
    <nomorganisation>APEL ASSOCIATION POUT DU LA MARAISNORD</nomorganisation>
    <adjudicataire>1</adjudicataire>
    <montantsoumis>0.000000</montantsoumis>
    <montantssoumisunite>0</montantssoumisunite>
    <montantcontrat>89732.240000</montantcontrat>
    <montanttotalcontrat>0.000000</montanttotalcontrat>
  </fournisseur>
</fournisseurs>
</avis>'''
root = ET.fromstring(xml)

data = []
fournisseur = root.find('.//fournisseur')
data.append({e.tag:e.text for e in fournisseur})
df = pd.DataFrame(data)
0
balderman 27 Ноя 2021 в 22:56