Python - Procesamiento XML

XML es un lenguaje portátil de código abierto que permite a los programadores desarrollar aplicaciones que pueden ser leídas por otras aplicaciones, independientemente del sistema operativo y / o lenguaje de desarrollo.

¿Qué es XML?

El Lenguaje de marcado extensible (XML) es un lenguaje de marcado muy parecido a HTML o SGML. Esto es recomendado por el World Wide Web Consortium y está disponible como estándar abierto.

XML es extremadamente útil para realizar un seguimiento de pequeñas o medianas cantidades de datos sin necesidad de una red troncal basada en SQL.

Arquitecturas y API de XML Parser

La biblioteca estándar de Python proporciona un conjunto mínimo pero útil de interfaces para trabajar con XML.

Las dos API más básicas y más utilizadas para datos XML son las interfaces SAX y DOM.

  • Simple API for XML (SAX)- Aquí, registra devoluciones de llamada para eventos de interés y luego deja que el analizador continúe con el documento. Esto es útil cuando sus documentos son grandes o tiene limitaciones de memoria, analiza el archivo a medida que lo lee desde el disco y el archivo completo nunca se almacena en la memoria.

  • Document Object Model (DOM) API - Esta es una recomendación del World Wide Web Consortium en la que todo el archivo se lee en la memoria y se almacena en forma jerárquica (basada en árboles) para representar todas las características de un documento XML.

SAX obviamente no puede procesar información tan rápido como DOM cuando trabaja con archivos grandes. Por otro lado, usar DOM exclusivamente puede matar realmente sus recursos, especialmente si se usa en muchos archivos pequeños.

SAX es de solo lectura, mientras que DOM permite cambios en el archivo XML. Dado que estas dos API diferentes se complementan literalmente entre sí, no hay ninguna razón por la que no pueda usarlas para proyectos grandes.

Para todos nuestros ejemplos de código XML, usemos un archivo XML simple movies.xml como entrada:

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

Analizar XML con API SAX

SAX es una interfaz estándar para el análisis de XML controlado por eventos. Analizar XML con SAX generalmente requiere que cree su propio ContentHandler subclasificando xml.sax.ContentHandler.

Su ContentHandler maneja las etiquetas y atributos particulares de su (s) sabor (s) de XML. Un objeto ContentHandler proporciona métodos para manejar varios eventos de análisis. Su analizador propietario llama a los métodos ContentHandler mientras analiza el archivo XML.

Los métodos startDocument y endDocument se llaman al principio y al final del archivo XML. Los caracteres del método (texto) se transmiten datos de caracteres del archivo XML a través del texto del parámetro.

El ContentHandler se llama al principio y al final de cada elemento. Si el analizador no está en modo de espacio de nombres, se llama a los métodos startElement (etiqueta, atributos) y endElement (etiqueta) ; de lo contrario, se llaman a los métodos correspondientes startElementNS y endElementNS . Aquí, etiqueta es la etiqueta del elemento y atributos es un objeto de atributos.

Aquí hay otros métodos importantes que debe comprender antes de continuar:

El método make_parser

El siguiente método crea un nuevo objeto analizador y lo devuelve. El objeto de analizador creado será del primer tipo de analizador que encuentre el sistema.

xml.sax.make_parser( [parser_list] )

Aquí está el detalle de los parámetros:

  • parser_list - El argumento opcional que consiste en una lista de analizadores a utilizar que deben implementar el método make_parser.

El método de análisis

El siguiente método crea un analizador SAX y lo usa para analizar un documento.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

Aquí está el detalle de los parámetros:

  • xmlfile - Este es el nombre del archivo XML para leer.

  • contenthandler - Debe ser un objeto ContentHandler.

  • errorhandler - Si se especifica, errorhandler debe ser un objeto SAX ErrorHandler.

El método parseString

Hay un método más para crear un analizador SAX y para analizar el especificado XML string.

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

Aquí está el detalle de los parámetros:

  • xmlstring - Este es el nombre de la cadena XML para leer.

  • contenthandler - Debe ser un objeto ContentHandler.

  • errorhandler - Si se especifica, errorhandler debe ser un objeto SAX ErrorHandler.

Ejemplo

#!/usr/bin/python

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # Call when an element starts
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title

   # Call when an elements ends
   def endElement(self, tag):
      if self.CurrentData == "type":
         print "Type:", self.type
      elif self.CurrentData == "format":
         print "Format:", self.format
      elif self.CurrentData == "year":
         print "Year:", self.year
      elif self.CurrentData == "rating":
         print "Rating:", self.rating
      elif self.CurrentData == "stars":
         print "Stars:", self.stars
      elif self.CurrentData == "description":
         print "Description:", self.description
      self.CurrentData = ""

   # Call when a character is read
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
  
if ( __name__ == "__main__"):
   
   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # override the default ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("movies.xml")

Esto produciría el siguiente resultado:

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

Para obtener un detalle completo sobre la documentación de la API SAX, consulte las API estándar de Python SAX .

Analizar XML con DOM API

El Document Object Model ("DOM") es una API en varios idiomas del World Wide Web Consortium (W3C) para acceder y modificar documentos XML.

El DOM es extremadamente útil para aplicaciones de acceso aleatorio. SAX solo le permite ver un fragmento del documento a la vez. Si está mirando un elemento SAX, no tiene acceso a otro.

Esta es la forma más sencilla de cargar rápidamente un documento XML y crear un objeto minidom utilizando el módulo xml.dom. El objeto minidom proporciona un método analizador simple que crea rápidamente un árbol DOM a partir del archivo XML.

La frase de ejemplo llama a la función parse (file [, parser]) del objeto minidom para analizar el archivo XML designado por file en un objeto de árbol DOM.

#!/usr/bin/python

from xml.dom.minidom import parse
import xml.dom.minidom

# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")

# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")

# Print detail of each movie.
for movie in movies:
   print "*****Movie*****"
   if movie.hasAttribute("title"):
      print "Title: %s" % movie.getAttribute("title")

   type = movie.getElementsByTagName('type')[0]
   print "Type: %s" % type.childNodes[0].data
   format = movie.getElementsByTagName('format')[0]
   print "Format: %s" % format.childNodes[0].data
   rating = movie.getElementsByTagName('rating')[0]
   print "Rating: %s" % rating.childNodes[0].data
   description = movie.getElementsByTagName('description')[0]
   print "Description: %s" % description.childNodes[0].data

Esto produciría el siguiente resultado:

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

Para obtener detalles completos sobre la documentación de la API DOM, consulte las API DOM estándar de Python .