1
resposta

Leitura de Arquivo XML inteiro

Olá Bom dia!

Tenho uma Lista com centenas de arquivos XML e a ideia é abrir todos os arquivos e criar um Pandas Dataframe com o o valor de todos esses XML.

Tentei o seguinte codigo

xml.etree.ElementTree as ET
tree = ET.parse('Path')
root = tree.getroot()
#converte todo o XML em string e depois faz o decode para ficar na esrtrutura correta. 
ET.tostring(root, encoding="utf8").decode("utf8"))

Com esta função Consigo deixar todo o arquivo XML na estrutura correta, só precisaria passar todo o conteúdo dessa string para dentro de um Panda DataFrame

Alguma dica de como isso pode ser feito?

1 resposta

Oii Luiz, como você está?

Peço desculpas pela demora em obter um retorno.

A partir da versão 1.3.0 o pandas contém uma função responsável por ler um arquivo xml e transformá-lo em um dataframe, a read_html.

Suponha que tenhamos o seguinte arquivo XML:

<?xml version='1.0' encoding='utf-8'?>
<data xmlns="http://example.com">
 <row>
   <shape>square</shape>
   <degrees>360</degrees>
   <sides>4.0</sides>
 </row>
 <row>
   <shape>circle</shape>
   <degrees>360</degrees>
   <sides/>
 </row>
 <row>
   <shape>triangle</shape>
   <degrees>180</degrees>
   <sides>3.0</sides>
 </row>
</data>

Para transformá-lo em um dataframe com as informações das tags, basta utilizarmos o seguinte comando:

pd.read_xml('arquivo.xml')

Que resultará no seguinte dataframe:

shapedegreessides
0square3604
1circle360nan
2triangle1803

Para o seu caso em específico basta passarmos como parâmetro da função read_xml a string com a estrutura xml correta:

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

tree = ET.parse('arquivo.xml')
root = tree.getroot()
#converte todo o XML em string e depois faz o decode para ficar na esrtrutura correta. 
xml_estruturado = ET.tostring(root, encoding="utf8").decode("utf8")
print(pd.read_xml(xml_estruturado))

Para instalar a versão do pandas 1.3.0, execute o seguinte comando no terminal:

pip install pandas==1.3.0

Qualquer dúvida fico à disposição.

Grande abraço!