En este artículo, aprenderemos cómo crear Pandas DataFrame a partir de XML anidado. Usaremos el módulo xml.etree.ElementTree , que es un módulo incorporado en Python para analizar o leer información del archivo XML. ElementTree representa el documento XML como un árbol y Element representa solo un Node del árbol.
Funciones utilizadas:
Aquí, usaremos algunas funciones para procesar el código que se indica a continuación:
- ElementTree.parse (archivo XML): para leer datos de un archivo XML
- root.iter(‘root_name’): para iterar a través de las ramas del Node raíz
- ElementTree.fromstring (XML_file): para leer datos cuando el código XML se pasa como una string dentro de comillas triples en el código python
- prstree.findall(‘store’): Para encontrar todos los elementos del XML ElementTree analizado
- node.attribute.get(attribte_name ): para obtener el atributo
- node.find(attribte_name): para recuperar el contenido de texto del atributo_name mencionado
- pandas.DataFrame() : Para convertir los datos XML a un DataFrame
- list.append() : Para agregar los elementos a una lista
Acercarse
- Analice o lea el archivo XML utilizando la función ElementTree.parse( ) y obtenga el elemento raíz.
- Iterar a través del Node raíz para obtener los atributos de los Nodes secundarios ‘SL NO’ (aquí) y extraer los valores de texto de cada atributo (aquí alimento, precio, cantidad y descuento).
- Obtenga los alimentos respectivos con especificaciones como una unidad adjunta a una lista (aquí lista all_items()).
- Convierta la lista en un DataFrame usando la función pandas.DataFrame() y mencione los nombres de las columnas entre comillas separadas por comas.
- Imprime el DataFrame y listo.
Entrada de datos XML anidados
XML
<?xml version="1.0" encoding="UTF-8"?> <Food> <Info> <Msg>Food Store items.</Msg> </Info> <store slNo="1"> <foodItem>meat</foodItem> <price>200</price> <quantity>1kg</quantity> <discount>7%</discount> </store> <store slNo="2"> <foodItem>fish</foodItem> <price>150</price> <quantity>1kg</quantity> <discount>5%</discount> </store> <store slNo="3"> <foodItem>egg</foodItem> <price>100</price> <quantity>50 pieces</quantity> <discount>5%</discount> </store> <store slNo="4"> <foodItem>milk</foodItem> <price>50</price> <quantity>1 litre</quantity> <discount>3%</discount> </store> </Food>
Ejemplo 1:
En este código a continuación hemos analizado el archivo XML. Proporcione la ruta completa donde guardó el archivo XML entre comillas. Así que aquí necesitamos usar la función ElementTree.parse() para leer los datos del archivo XML y luego la función getroot() para obtener la raíz. Luego siga los pasos dados.
Python3
import xml.etree.ElementTree as ETree import pandas as pd # give the path where you saved the xml file # inside the quotes xmldata = "C: \\ProgramData\\Microsoft\\ Windows\\Start Menu\\Programs\\ Anaconda3(64-bit)\\xmltopandas.xml" prstree = ETree.parse(xmldata) root = prstree.getroot() # print(root) store_items = [] all_items = [] for storeno in root.iter('store'): store_Nr = storeno.attrib.get('slNo') itemsF = storeno.find('foodItem').text price = storeno.find('price').text quan = storeno.find('quantity').text dis = storeno.find('discount').text store_items = [store_Nr, itemsF, price, quan, dis] all_items.append(store_items) xmlToDf = pd.DataFrame(all_items, columns=[ 'SL No', 'ITEM_NUMBER', 'PRICE', 'QUANTITY', 'DISCOUNT']) print(xmlToDf.to_string(index=False))
Producción:
Nota : el archivo XML debe guardarse en el mismo directorio o carpeta donde guardó su código de Python.
Ejemplo 2:
También podemos pasar el contenido XML como una string entre comillas triples. En ese caso, necesitamos usar la función fromstring() para leer la string. Obtenga la raíz usando el objeto ‘etiqueta’ y siga los mismos pasos para convertirlo en un DataFrame como se mencionó anteriormente.
Python3
import xml.etree.ElementTree as ETree import pandas as pd xmldata = '''<?xml version="1.0" encoding="UTF-8"?> <Food> <Info> <Msg>Food Store items.</Msg> </Info> <store slNo="1"> <foodItem>meat</foodItem> <price>200</price> <quantity>1kg</quantity> <discount>7%</discount> </store> <store slNo="2"> <foodItem>fish</foodItem> <price>150</price> <quantity>1kg</quantity> <discount>5%</discount> </store> <store slNo="3"> <foodItem>egg</foodItem> <price>100</price> <quantity>50 pieces</quantity> <discount>5%</discount> </store> <store slNo="4"> <foodItem>milk</foodItem> <price>50</price> <quantity>1 litre</quantity> <discount>3%</discount> </store> </Food> ''' prstree = ETree.fromstring(xmldata) root = prstree.tag #print(root) store_items = [] all_items = [] for storeno in prstree.findall('store'): store_Nr = storeno.attrib.get('slNo') itemsF= storeno.find('foodItem').text price= storeno.find('price').text quan= storeno.find('quantity').text dis= storeno.find('discount').text store_items = [store_Nr,itemsF,price,quan,dis] all_items.append(store_items) xmlToDf = pd.DataFrame(all_items,columns=[ 'SL No','ITEM_NUMBER','PRICE','QUANTITY','DISCOUNT']) print(xmlToDf.to_string(index=False))
Producción:
Publicación traducida automáticamente
Artículo escrito por rijushree100guha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA