« Programmation Python/XML » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Ligne 6 : Ligne 6 :
== La méthode SAX ==
== La méthode SAX ==


Cette méthode est basée sur les évenements : une fonction est appelée lors que l' on ouvre une balise, une autre lors que le programme rencontre du texte, et une autre encore lors que la balise se ferme.
Cette méthode est basée sur les évènements : une fonction est appelée lors que l' on ouvre une balise, une autre lors que le programme rencontre du texte, et une autre encore lors que la balise se ferme.


Ces évenements sont définis dans une classe nommée '''interface'''. Cette classe doit dériver de ContentHandler, contenu dans le module ''xml.sax'', et peut implémenter les fonctions suivantes :
Ces évènements sont définis dans une classe nommée '''interface'''. Cette classe doit dériver de ContentHandler, contenu dans le module ''xml.sax'', et peut implémenter les fonctions suivantes :


* ''startElement''() est la fonction appelée lors de l' ouverture d' une balise. Les deux arguments sont le nom et un dictionnaire contenant les attributs.
* ''startElement''() est la fonction appelée lors de l' ouverture d' une balise. Les deux arguments sont le nom et un dictionnaire contenant les attributs.
* ''endElemeent''() est la fonction appelée lors de la fermeture d' une balise. La fonction prend le nom de la balise en argument.
* ''endElemeent''() est la fonction appelée lors de la fermeture d' une balise. La fonction prend le nom de la balise en argument.
* ''characters''() est appelée lors que le parseur rencontre un caractére en dehors d' une balise. Ce caractére est passé en paramétre.
* ''characters''() est appelée lors que le parseur rencontre un caractère en dehors d' une balise. Ce caractère est passé en paramètre.


Une fois cette classe faite, il faut créer un parseur. Cela est fait grâce à la fonction '''make_parser'''(), située elle aussi dans le module ''xml.sax''.
Une fois cette classe faite, il faut créer un parseur. Cela est fait grâce à la fonction '''make_parser'''(), située elle aussi dans le module ''xml.sax''.

Version du 21 mars 2008 à 11:45

Il existe dans python une bibliothéque permettant de manipuler les fichiers XML. Elle implémente la maniére SAX (Simple API for XML) et DOM(Document Object Model).

Voyons comment manipuler simplement les fichier XML grâce à la méthode SAX.

La méthode SAX

Cette méthode est basée sur les évènements : une fonction est appelée lors que l' on ouvre une balise, une autre lors que le programme rencontre du texte, et une autre encore lors que la balise se ferme.

Ces évènements sont définis dans une classe nommée interface. Cette classe doit dériver de ContentHandler, contenu dans le module xml.sax, et peut implémenter les fonctions suivantes :

  • startElement() est la fonction appelée lors de l' ouverture d' une balise. Les deux arguments sont le nom et un dictionnaire contenant les attributs.
  • endElemeent() est la fonction appelée lors de la fermeture d' une balise. La fonction prend le nom de la balise en argument.
  • characters() est appelée lors que le parseur rencontre un caractère en dehors d' une balise. Ce caractère est passé en paramètre.

Une fois cette classe faite, il faut créer un parseur. Cela est fait grâce à la fonction make_parser(), située elle aussi dans le module xml.sax. On lui associe ensuite une instance de l' interface avec la méthode setContentHandler(), et on lance l' analyse du fichier grâce à la méthode parse, qui prend le nom du fichier en argument.

Voici donc le code final :

from xml.sax.handler import ContentHandler
import xml.sax
import sys

class compteurElements(ContentHandler):
    def __init__(self):
        self.elem={}
    def startElement(self,name,attr):
        if not self.elem.has_key(name):
            self.elem[name] = 0
        self.elem[name] += 1
    def characters(self,ch):
        print ch
    def endElement (self, name):
        print name + ":" + str(self.elem[name])

parser = xml.sax.make_parser()
handler = compteurElements()
parser.setContentHandler(handler)
parser.parse(sys.argv[1])
Exemple 1 : un compteur d'élément bavard