Con ElementTree leer XML se parece mucho a recorrer una lista: buscas los elementos que te interesan y les pides el texto o los atributos.
También te puede interesar
El archivo
catalogo.xml<?xml version='1.0' encoding='utf-8'?>
<catalogo>
<libro id="1">
<titulo>El Quijote</titulo>
<autor>Cervantes & Saavedra</autor>
</libro>
</catalogo>Leerlo
import xml.etree.ElementTree as ET
arbol = ET.parse("catalogo.xml")
raiz = arbol.getroot()
print("raíz:", raiz.tag)
for libro in raiz.findall("libro"):
print(" id:", libro.get("id"),
"| titulo:", libro.findtext("titulo"),
"| autor:", libro.findtext("autor"))salidaraíz: catalogo id: 1 | titulo: El Quijote | autor: Cervantes & Saavedra
| Para… | Usa |
|---|---|
| Todos los hijos con ese nombre | elemento.findall("libro") |
| El primero | elemento.find("libro") |
| Su texto directamente | elemento.findtext("titulo") |
| Un atributo | elemento.get("id") |
| Buscar en cualquier nivel | raiz.iter("titulo") o findall(".//titulo") |
Cuando falta algo
print(raiz.find("libro").findtext("isbn"))
print(raiz.find("libro").findtext("isbn", default="(sin isbn)"))salidaNone (sin isbn)
Aquí está la ventaja de findtext frente al getElementsByTagName("nombre")[0] que usaba la versión anterior de esta página, con minidom: si el elemento no existe, aquello lanzaba IndexError, y esto devuelve None o el valor que le digas.
Rutas
print(raiz.find(".//libro[@id='1']/titulo").text)salidaEl Quijote
ElementTree entiende un subconjunto de XPath: .// para buscar a cualquier profundidad y [@atributo='valor'] para filtrar.
import por import defusedxml.ElementTree as ET.Más información en inglés: Read XML file in Python.
Todo el código se ejecutó con Python 3.14 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.
hola como seria si lo hacemos desde la red el archivo que leamo
Para abrir un xml desde la red:
from xml.dom import minidom
def main():
mydoc = minidom.parse(‘//160.131.102.1/folder1/foler2/data.xml’)
node = mydoc.getElementsByTagName(‘nombreDelPrimerNodo’)
for item1 in node:
print(str(item1))
pretty_xml_as_string = mydoc.toprettyxml()
print(str(pretty_xml_as_string))
if __name__ == «__main__»:
main()
Y si el xml se lo estoy pasando yo a la URL desde mi escritorio y una vez pasado quiero que lo interprete Python?
O sea yo me meto en una URL por ejemplo localhost:5000/contacto
Yo le paso un xml con datos de contacto de esta manera: localhost:5000/contacto?persona=ruta_del_archivo/persona.xml y le doy a enter
Cómo podría hacer para leer con Python ese xml desde la url? O sea el xml no está dentro de un path definido de la url.
Buenas, y si lo que hago es pasarle un xml a la url desde mi ordenador?
Es decir yo estoy en una url, por ejemplo: localhost:5000/contacto
Le paso el xml desde mi ordenador: localhost:5000/contacto?persona=ruta_del_archivo/persona.xml y le doy a enter.
En definitiva que el archivo xml no está en un path predefinido de la url si no que se lo introduzco yo.
En este caso cómo se haría para leer el xml desde Python?
Muchas gracias de antemano.
Perdona, ¿Hay alguna forma más precisa de obtener un elemento? Algo que nos permita obtener el elemento empleado cuyo id es igual a 2; sin tener que recorrer todos los elementos empleados, mirar cuál tiene su id igual a 2 y almacenarlo.
como leo un XML con esta sintaxis:
quiero leer la informacion que esta en la CDATA.
–
AUTORIZADO
0206202004179037150600120020210001091840010918410
2020-06-08T15:45:24-05:00
PRODUCCIÓN
–
– <![CDATA[
2
1
QUIFATEX S.A.