Python – Leer archivo XML

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.

El archivo

catalogo.xml<?xml version='1.0' encoding='utf-8'?>
<catalogo>
  <libro id="1">
    <titulo>El Quijote</titulo>
    <autor>Cervantes &amp; 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 nombreelemento.findall("libro")
El primeroelemento.find("libro")
Su texto directamenteelemento.findtext("titulo")
Un atributoelemento.get("id")
Buscar en cualquier nivelraiz.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.

Si el XML viene de fuera, usa defusedxml. Un XML preparado puede tumbar el programa con entidades que se expanden hasta llenar la memoria. La propia documentación de Python recomienda este paquete para XML que no controles: se usa igual, cambiando el import por import defusedxml.ElementTree as ET.
El XML de ejemplo de la versión anterior guardaba usuarios con sus contraseñas en claro. Como ejemplo era inofensivo, pero no es algo que convenga ver como normal: las contraseñas no se guardan, se guarda su hash.

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.

6 comentarios en «Python – Leer archivo XML»

    • 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()

      Responder
      • 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.

        Responder
      • 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.

        Responder
  1. 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.

    Responder
  2. 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.

    Responder

Deja un comentario