Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Python

Python - Traitement XML

Page PrécédentePage Suivante

XML est un langage open source portable qui permet aux programmeurs de développer des applications pouvant être lues par d'autres applications, quel que soit le système d'exploitation et/ou le langage de développement.

Qu'est-ce que XML ?

Le langage de balisage extensible (XML) est un langage de balisage similaire à HTML ou SGML. Ceci est recommandé par le World Wide Web Consortium et disponible en tant que norme ouverte.

XML est extrêmement utile pour garder une trace de petites et moyennes quantités de données sans avoir besoin d'un backbone basé sur SQL.

Architectures et API d'analyseur XML

La bibliothèque standard Python fournit un ensemble minimal mais utile d'interfaces pour travailler avec XML.

Les deux API les plus basiques et les plus largement utilisées pour les données XML sont les interfaces SAX et DOM.

SAX ne peut évidemment pas traiter les informations aussi rapidement que DOM lorsqu'il travaille avec des fichiers volumineux. D'un autre côté, l'utilisation exclusive de DOM peut vraiment tuer vos ressources, surtout si vous l'utilisez sur un grand nombre de petits fichiers.

SAX est en lecture seule, tandis que DOM permet de modifier le fichier XML. Étant donné que ces deux API différentes se complètent littéralement, il n'y a aucune raison pour que vous ne puissiez pas les utiliser toutes les deux pour de grands projets.

Pour tous nos exemples de code XML, utilisons un simple fichier XML movies.xml comme entrée −

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

Analyse XML avec les API SAX

SAX est une interface standard pour l'analyse XML pilotée par les événements. L'analyse XML avec SAX nécessite généralement que vous créiez votre propre ContentHandler en sous-classant xml.sax.ContentHandler.

Votre gestionnaire de contenu gère les balises et les attributs particuliers de votre ou vos version(s) de XML. Un objet ContentHandler fournit des méthodes pour gérer divers événements d'analyse. Son analyseur propriétaire appelle les méthodes ContentHandler lorsqu'il analyse le fichier XML.

Les méthodes startDocument et endDocument sont appelés au début et à la fin du fichier XML. La méthode characters(text) sont transmises les données textuelles du fichier XML via le paramètre texte.

Le ContentHandler est appelé au début et à la fin de chaque élément. Si l'analyseur n'est pas en mode espace de noms, les méthodes startElement(tag, attributs) et endElement(tag) sont appelés; sinon, les méthodes correspondantes startElementNS et endElementNS sont appelés. Ici, tag est la balise de l'élément, et attributes est un objet Attributes.

Voici d'autres méthodes importantes à comprendre avant de continuer −

Le make_parser Méthode

La méthode suivante crée un nouvel objet analyseur et le renvoie. L'objet analyseur créé sera du premier type d'analyseur trouvé par le système.

xml.sax.make_parser( [parser_list] )

Voici le détail des paramètres −

L'analyse Méthode

La méthode suivante crée un analyseur SAX et l'utilise pour analyser un document.

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

Voici le détail des paramètres −

La parseString Méthode

Il existe une autre méthode pour créer un analyseur SAX et analyser la chaîne XML spécifiée .

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

Voici le détail des paramètres −

Exemple

#!/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")

Cela produirait le résultat suivant −

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

Pour un détail complet sur la documentation de l'API SAX, veuillez vous référer aux API Python SAX standard.

Analyse XML avec les API DOM

Le Document Object Model ("DOM") est une API multilingue du World Wide Web Consortium (W3C) permettant d'accéder et de modifier des documents XML.

Le DOM est extrêmement utile pour les applications à accès aléatoire. SAX ne vous permet de voir qu'un seul bit du document à la fois. Si vous regardez un élément SAX, vous n'avez pas accès à un autre.

Voici le moyen le plus simple de charger rapidement un document XML et de créer un objet minidom à l'aide du module xml.dom. L'objet minidom fournit une méthode d'analyse simple qui crée rapidement une arborescence DOM à partir du fichier XML.

L'exemple de phrase appelle la fonction parse( file [,parser] ) de l'objet minidom pour analyser le fichier XML désigné par file dans un objet arborescent 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

Cela produirait le résultat suivant −

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

Pour un détail complet sur la documentation de l'API DOM, veuillez vous référer aux API Python DOM standard.


Python

  1. Chaînes Python
  2. Python - Boucles
  3. Opérateurs Python :arithmétique, logique, comparaison, affectation, bit à bit et priorité
  4. Python - Chaînes
  5. Python RegEx
  6. Comment obtenir la date et l'heure actuelles en Python ?