Python - Procesamiento XML
Página anteriorPágina siguiente
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 un estándar abierto.
XML es extremadamente útil para realizar un seguimiento de pequeñas y medianas cantidades de datos sin necesidad de una red troncal basada en SQL.
Arquitecturas de analizador XML y API
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.
-
API simple para XML (SAX) − Aquí, registra devoluciones de llamadas para eventos de interés y luego deja que el analizador avance a través del 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.
-
API del modelo de objeto de documento (DOM) − Esta es una recomendación del Consorcio World Wide Web en la que todo el archivo se lee en la memoria y se almacena en forma jerárquica (basada en un árbol) para representar todas las características de un documento XML.
Obviamente, SAX no puede procesar información tan rápido como DOM cuando se trabaja con archivos grandes. Por otro lado, el uso exclusivo de DOM realmente puede acabar con 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 literalmente se complementan entre sí, no hay 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>
Análisis de XML con API SAX
SAX es una interfaz estándar para el análisis de XML basado en eventos. El análisis de XML con SAX generalmente requiere que cree su propio ContentHandler creando una subclase de xml.sax.ContentHandler.
Su controlador de contenido maneja las etiquetas y atributos particulares de su(s) tipo(s) de XML. Un objeto ContentHandler proporciona métodos para controlar varios eventos de análisis. Su analizador propietario llama a los métodos ContentHandler mientras analiza el archivo XML.
Los métodos startDocument y documentofinal se llaman al principio y al final del archivo XML. El método caracteres(texto) se pasan 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, los métodos startElement(etiqueta, atributos) y endElement(etiqueta) son llamados; de lo contrario, los métodos correspondientes startElementNS y endElementNS son llamados. Aquí, la etiqueta es la etiqueta del elemento y los atributos son un objeto de atributos.
Aquí hay otros métodos importantes para entender antes de continuar −
El make_parser Método
El siguiente método crea un nuevo objeto analizador y lo devuelve. El objeto 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 −
-
lista_analizador − El argumento opcional que consiste en una lista de analizadores a utilizar que deben implementar el método make_parser.
El análisis Método
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 −
-
archivo xml − Este es el nombre del archivo XML para leer.
-
controlador de contenido − Debe ser un objeto ContentHandler.
-
controlador de errores − Si se especifica, el controlador de errores debe ser un objeto SAX ErrorHandler.
La cadena de análisis Método
Hay un método más para crear un analizador SAX y analizar la cadena XML especificada. .
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Aquí está el detalle de los parámetros −
-
cadena xml − Este es el nombre de la cadena XML para leer.
-
controlador de contenido − Debe ser un objeto ContentHandler.
-
controlador de errores − Si se especifica, el controlador de errores 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 detalles completos sobre la documentación de la API SAX, consulte las API SAX estándar de Python.
Análisis de XML con API DOM
El modelo de objeto de documento ("DOM") es una API multilingüe 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 bit del documento a la vez. Si está mirando un elemento SAX, no tiene acceso a otro.
Esta es la forma más fácil 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 de análisis simple que crea rápidamente un árbol DOM a partir del archivo XML.
La frase de muestra 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 de DOM, consulte las API de DOM de Python estándar.
python