SAXParser
, et un objet de gestion des événements (
handler
), qui doit implémenter plusieurs interfaces. Dans la pratique, cet objet sera le plus souvent une extension de la classe
DefaultHandler
.
La classe
SAXParser
est abstraite, il n’est donc pas possible de l’instancier directement. Pour obtenir un objet de cette classe, on doit passer par une
factory
, la classe
SAXParserFactory
. Une factory (usine en anglais), est par convention une classe qui possède une méthode statique
newInstance()
, qui renvoie une instance de cette classe. Une fois que l’on a cette instance, un appel à la méthode
newSAXParser()
nous renvoie un objet de type
SAXParser
.
Exemple 43. Création d'une
SAXParserFactory
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance() ; saxParserFactory.setValidating(true) ; // ou false si l'on veut un analyseur // non validant saxParserFactory.setNameSpaceAware(true) ; // ou false si l'on ne veut pas // prendre en compte // les espaces de nom SAXParser saxParser = saxParserFactory.newSAXParser() ;
Factory
.
La ligne qui permet de rendre l’analyseur validant est facultative si la valeur passée est
false
.
Cet objet de type
SAXParser
contient un objet de type
XMLReader
, sur lequel on peut obtenir une référence par appel de la méthode
getXMLReader()
. On peut configurer cet objet, en fixant pour lui un certain nombre de propriétés standard. Nous verrons l’une de ces propriétés à la fin de cette section. En général, les propriétés par défaut sont suffisantes.
Notre objet
SAXParser
fonctionne avec un gestionnaire, objet de type
DefaultHandler
. Ce type est une classe concrète, que l’on peut donc instancier. Elle implémente les quatre interfaces
ContentHandler
,
ErrorHandler
,
DTDHandler
et
EntityResolver
. La bonne façon de faire est donc d’étendre cette classe, et de surcharger les méthodes dont on a besoin.
DefaultHandler
. Cette classe possède 17 méthodes, appelées comme des callbacks par l'analyseur SAX lorsqu'il rencontre différentes choses dans le document qu'il analyse.
Par exemple, au tout début de l'analyse, l'analyseur appelle la méthode
startDocument()
, ce qui marque le début de l'analyse pour le callback.
À chaque fois que l'analyseur rencontre un début d'élément, qu'il s'agisse de l'élément racine ou de tout autre élément XML de notre document, il va appeler la méthode
startElemenent()
. Cette méthode prend quatre paramètres.
String uri
: l'URI de l'espace de nom de cet élément ;
String localName
: le nom local de cet élément, c'est-à-dire sans son préfixe ni son espace de noms ;
String qName
: le nom qualifié de cet élément, avec son préfixe ;
Attributes attributes
: les attributs de cet élément, s'il en a.
uri
et
localName
seront systématiquement vides. Le nom qualifé contient le nom de l'élément, avec son préfixe s'il en a un.
Dans le cas contraire, deux situations peuvent se présenter.
Exemple 44. Un document XML analysé par SAX
<?xml version="1.0" encoding="UTF-8"?> <galilee:marins xmlns:galilee="http://www.galilee.org/marins"> <galilee:marin id="12" lang="FR"> <nom>Surcouf</nom> <prenom>Robert</prenom> <age>12</age> </galilee:marin> <galilee:marin id="5"> <nom>Tabarly</nom> <prenom>Eric</prenom> </galilee:marin> </galilee:marins>
DefaultHandler
.
Exemple 45. Classe
DefaultHandler
// construction de notre handler, classe anonyme DefaultHandler handler = new DefaultHandler() { public void startDocument() { System.out.println("Début de l'analyse..."); } public void startElement(String uri, String localName, String qName, Attributes attributes) { System.out.println("uri = " + uri); System.out.println("local name = " + localName); System.out.println("qName = " + qName); } };
Début de l'analyse... uri = http://www.galilee.org/marins local name = marins qName = galilee:marins uri = http://www.galilee.org/marins local name = marin qName = galilee:marin uri = local name = nom qName = nom uri = local name = prenom qName = prenom uri = local name = age qName = age uri = http://www.galilee.org/marins local name = marin qName = galilee:marin uri = local name = nom qName = nom uri = local name = prenom qName = prenomOn voit sur cette première analyse les différences de comportement de l'analyseur entre les éléments attachés à un espace de nom, et ceux qui ne le sont pas. Voici à présent le résultat de l'analyse avec un analyseur qui ne prend pas en compte les espaces de nom.
Début de l'analyse... uri = local name = qName = galilee:marins uri = local name = qName = galilee:marin uri = local name = qName = nom uri = local name = qName = prenom uri = local name = qName = age uri = local name = qName = galilee:marin uri = local name = qName = nom uri = local name = qName = prenomVoyons maintenant ces quatre interfaces et les méthodes qu’elles contiennent.
Node
NodeList
Element
Attr
CharacterData
Comment
CDATASection
Text
Entity
EntityReference
ProcessingInstruction
Document
DocumentFragment
DocumentType