Análisis de XML en Python


¿Qué es XML?

XML se refiere al Lenguaje de Marcado Extensible (eXtensible Markup Lxtensible Markup Language).Puedes aprender a través de este sitio web

Tutorial de XML

XML está diseñado para transmitir y almacenar datos.

XML es un conjunto de reglas que definen marcas semánticas; estas marcas dividen un documento en muchas partes y las identifican.


Análisis de XML en Python

El análisis de XML en Python

Las interfaces de programación XML más comunes son DOM y SAX. Estos dos interfaces manejan archivos XML de manera diferente y, por supuesto, también son diferentes en sus casos de uso.

1.SAX (simple API for XML )

Python tiene tres métodos para analizar XML: SAX, DOM y ElementTree:

2.DOM(Document Object Model)

La biblioteca estándar de Python incluye un analizador SAX. SAX utiliza un modelo controlado por eventos; durante el análisis de XML, dispara eventos uno a uno y llama a funciones de devolución de llamada definidas por el usuario para procesar el archivo XML.

3.ElementTree (árbol de elementos)

3. ElementTree (árbol de elementos)

ElementTree es como un DOM ligero, con una API conveniente y amigable. Tiene buena reutilización de código, es rápido y consume poca memoria.Nota:

Debido a que DOM necesita mapear los datos XML a un árbol en memoria, por un lado es más lento y por otro consume más memoria, mientras que SAX lee el archivo XML en flujo (streaming), es más rápido y usa menos memoria, pero requiere que el usuario implemente funciones de devolución de llamada (handler).

movies.xml

<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>

Python analiza XML usando SAX

Análisis de XML con SAX en Python

SAX es una API basada en eventos.Usar SAX para analizar documentos XML involucra dos partes:yAnalizador。

Manejador de eventos

El analizador se encarga de leer el documento XML y enviar eventos al manejador de eventos, como el evento de inicio de elemento y el evento de fin de elemento.

  • El manejador de eventos es responsable de responder a los eventos y procesar los datos XML transmitidos.
  • 1. Procesar archivos grandes;
  • 2. Solo se necesita parte del contenido del archivo, o solo obtener información específica del archivo.

3. Cuando se desea construir su propio modelo de objetos.

Introducción a los métodos de la clase ContentHandler

Introducción a los métodos de la clase ContentHandler

Método characters(content)

Momento de la llamada:

Desde el inicio de la línea, antes de encontrar una etiqueta, si hay caracteres, el valor de content son esas cadenas.

Desde una etiqueta, antes de encontrar la siguiente etiqueta, si hay caracteres, el valor de content son esas cadenas.

Desde una etiqueta, antes de encontrar el fin de línea, si hay caracteres, el valor de content son esas cadenas.

La etiqueta puede ser una etiqueta de apertura o una etiqueta de cierre.

Método startDocument()

Se llama cuando el documento comienza.

Método endDocument()

Se llama cuando el analizador llega al final del documento.

Método startElement(name, attrs)

Se llama cuando se encuentra una etiqueta de apertura XML; name es el nombre de la etiqueta y attrs es el diccionario de valores de atributos de la etiqueta.

Método endElement(name)


Método make_parser

Método make_parser

xml.sax.make_parser( [parser_list] )

El siguiente método crea un nuevo objeto analizador y lo devuelve.

  • parser_listDescripción de parámetros:

Método parser

Método parser

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

El siguiente método crea un analizador SAX y analiza un documento XML:

  • xmlfileDescripción de parámetros:
  • contenthandler- nombre del archivo XML
  • errorhandler- debe ser un objeto ContentHandler

Método parseString

Método parseString

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

El método parseString crea un analizador XML y analiza una cadena XML:

  • xmlstringDescripción de parámetros:
  • contenthandler- cadena XML
  • errorhandler- debe ser un objeto ContentHandler

Ejemplo de análisis de XML en Python

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- 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 = "" Ejemplo def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Movie*****" title = attributes["title"] print "Title:", title # Manejo del evento de inicio de elemento 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 = "" # Manejo del evento de fin de elemento 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__"): # Manejo del evento de contenido parser = xml.sax.make_parser() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) # Crear un XMLReader Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")

# Sobrescribir ContextHandler

*****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

El resultado de ejecutar el código anterior es el siguiente:Python SAX APIs


Análisis de XML con xml.dom

Análisis de XML con xml.dom

El Modelo de Objetos de Documento (Document Object Model, abreviado DOM) es la interfaz de programación estándar recomendada por la organización W3C para procesar XML (lenguaje de marcado extensible).

Un analizador DOM, al analizar un documento XML, lee todo el documento de una vez y guarda todos los elementos del documento en una estructura de árbol en memoria. Luego puede utilizar las diferentes funciones proporcionadas por DOM para leer o modificar el contenido y la estructura del documento, y también puede escribir el contenido modificado en un archivo XML.

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- from xml.dom.minidom import parse import xml.dom.minidom Ejemplo DOMTree = xml.dom.minidom.parse("movies.xml") collection = DOMTree.documentElement if collection.hasAttribute("shelf"): print "Root element : %s" % collection.getAttribute("shelf") # Abrir el documento XML con el analizador minidom movies = collection.getElementsByTagName("movie") # Obtener todas las películas de la colección 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

# Imprimir la información detallada de cada película

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

El resultado de ejecutar el programa anterior es el siguiente:Python DOM APIs。

Consulte la documentación completa de la API DOM