Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> python

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.

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 −

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 −

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 −

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

  1. Tipos de datos de Python
  2. Operadores de Python
  3. Declaración de paso de Python
  4. Argumentos de la función de Python
  5. Diccionario de Python
  6. Iteradores de Python
  7. Cierres Python
  8. Fecha y hora de Python
  9. Sueño de Python ()
  10. Python - Descripción general
  11. Pitón - Números