startDocument()
et
endDocument()
: appelées lorsqu’un début ou une fin de document est rencontrée ;
startElement()
et
endElement()
: appelées lorsqu’un début ou une fin d’élément est rencontrée.
characters()
: appelée quand un contenu de type
PCDATA
est rencontré.
setDocumentLocator()
: appelée pour passer un objet de type
Locator
, que nous allons voir dans la suite.
startDocument()
est appelée une fois lorsqu’un début de document est rencontré. Elle ne reçoit aucun paramètre. La méthode
endDocument()
est appelée une fois que l’analyse du document est entièrement terminée. Elle est appelée même si une erreur s’est produite lors de l’analyse.
uri
,
localName
: deux chaînes de caractères qui contiennent l’URI de l’espace de noms si elle existe, et le nom dans cette URI, sans préfixe.
qName
: une chaîne de caractères qui contient le nom complet (
fully qualified name
), en général avec un préfixe.
startElement()
reçoit en plus un objet de type
Attributes
, qui contient les attributs de cet élément.
Attributes
fonctionne un peu comme un tableau. On peut regretter qu’il n’utilise aucune des interfaces de type
Collection
, à la différence de DOM4J. On peut obtenir le nombre d’attributs par la méthode
getLength()
, puis parcourir les noms de ces attributs par les méthodes
getLocalName(i)
et
getQName(i)
, et leurs valeurs par la méthode
getValue(i)
.
setLocator()
est appelée par l’analyseur SAX pour passer à notre implémentation un objet de type
Locator
. Le type
Locator
est bien sûr une interface, dont voici les méthodes.
L’objet
Locator
permet de retrouver le document XML analysé. Cet objet permet d’accéder à trois types d’information :
getColumnNumber()
et
getLineNumber()
: donne les coordonnées du point (le numéro de la ligne et de la colonne dans le fichier texte) auquel l’événement a eu lieu dans le document XML.
getPublicId()
: renvoie une chaîne de caractères qui contient l’identificateur public (URN) de l’élément dans lequel se trouve la balise qui a généré l’événement.
getSystemId()
: renvoie l’identificateur système (URL) de l’entité qui contient l’élément qui a généré l’événement.
char []
, suivi d’un offset et d’une longueur, tous deux de type
int
. Les données à lire sont les caractères référencés par cet offset et cette longueur.
Le contenu de l’élément est envoyé morceau par morceau, au gré de l’analyseur. La seule chose garantie est que le contenu d’un morceau donné ne vient que d’une seule source, ce qui permet d’avoir un
Locator
cohérent. Pourquoi ne pas retourner tout le contenu textuel d'un élément en une seule fois ? Tout simplement parce que SAX est conçu pour lire des flux, et que ces flux peuvent eux-mêmes être disponibles au compte-gouttes.
processingInstruction()
reçoit en paramètre deux chaînes de caractères :
target
: l’application-cible, ici ce qui peut être interprété comme une classe Java :
org.galilee.sql.ExecuteQuery
;
data
: l’argument de cette instruction, ici
sql="select * from Marins"
.
SAXParseException
. Cette classe contient notamment des méthodes qui permettent de trouver précisément l’endroit dans le document XML où l’erreur a été rencontrée.
Les erreurs peuvent être captées aussi par événement, en implémentant cette interface. Elle contient trois méthodes :
error()
,
fatalError()
et
warning()
, toutes trois appelées avec le même argument, de type
SAXParseException
.
Exemple 47. Définition d’une notation JPEG, et utilisation
<!NOTATION jpeg SYSTEM "viewer.exe"> <!ENTITY monImage SYSTEM "URL" NDATA "jpeg">
DTDHandler
définit deux méthodes appelées sur ces deux lignes :
notationDecl()
est une méthode appelée avec trois paramètres : le nom de la notation, son identificateur public et son identificateur système.
unparsedEntityDecl()
est une méthode appelée avec les trois mêmes paramètres, plus un quatrième : le nom de la notation.
"urn:/monServeur/maBase"
en
"http://192.168.1.80/base"
.
L’unique méthode de cette interface,
resolveEntity()
renvoie un objet de type
InputSource
, qui peut être ouvert sur un document local au serveur. Voyons ceci sur un exemple.
Exemple 48. Association d’un URL à une URN par
resolveEntity()
public InputSource resolveEntity(String publicId, String systemId) { if (systemId.equals("http://www.galilee.org/unDocument")) { Reader r = new InputStreamReader( new BufferedInputStream( new FileInputStream( new File("/fichiers/locaux/unDocument")))) ; InputSource is = new InputSource(r) ; } else { return null ; } }
LexicalHandler
. Si l’on veut avoir accès aux données de type
DTD
et
CDATA
, il faut implémenter certaines des méthodes de cette interface.
Les méthodes de cette interface fonctionnent exactement de la même façon que celles de
ContentHandler
: elles sont appelées lorsque l’analyseur rencontre la bonne balise. Passons ces méthodes en revue :
startDTD()
et
endDTD()
: appelées sur le début de la DTD (le
DOCTYPE
) et sur sa fin. La méthode
startDTD()
reçoit en paramètres une première chaîne de caractères qui contient le nom du document, une deuxième chaîne qui contient l’identificateur public de la DTD externe, et une troisième qui contient l’identificateur système de la DTD externe.
startEntity()
et
endEntity()
: appelées sur le début et la fin de la déclaration d’une entité (
ENTITY
). La méthode
statEntity()
reçoit en paramètre le nom de l’entité.
startCDATA()
et
endCDATA()
: appelées sur le début et la fin d’une section
CDATA
.
comment()
: appelée lorsque l’analyseur rencontre un commentaire XML. Cette méthode reçoit en paramètres la chaîne de commentaires, dans un tableau de
char
, avec un offset et une longueur de chaîne.
DefaultHandler
.
Il reste une déclaration à faire si l’on veut que notre analyseur SAX envoie les événements que nous voulons capter vers notre gestionnaire lexical. Voyons ceci sur un exemple.
Exemple 49. Création d’un analyseur avec gestion lexicale
LexicalHandler lexicalHandler = … ; // construction SAXParserFactory saxParserFactory = SAXParserFactory.newInstance() ; saxParserFactory.setValidating(true) ; // ou false si l'on veut un analyseur // non validant SAXParser saxParser = saxParserFactory.newSAXParser() ; XMLReader xmlReader = saxParser.getXMLReader() ; xmlReader.setProperty( "http://xml.org/sax/properties/lexical-handler", lexicalHandler) ; // déclaration standard saxParser.parse(fichier XML, lexicalHandler) ;
xmlr.setProperty("http://xml.org/sax/properties/lexical-handler", lexicalHandler)
fait partie du standard SAX.
Node
NodeList
Element
Attr
CharacterData
Comment
CDATASection
Text
Entity
EntityReference
ProcessingInstruction
Document
DocumentFragment
DocumentType