Vous êtes sur la page 1sur 33

Traitement de documents XML

Les API DOM et Sax

DOM et Sax p.1/33

Sommaire
Les deux principales interfaces de
programmation XML :
DOM (Document Object Model), bas sur
une reprsentation hirarchique
SaX (Simple API for XML), bas sur des
dclencheurs (vnements/action)

DOM et Sax p.2/33

Les API XML


LAPI SaX :
Dfinit des triggers qui se dclenchent sur
certaines balises.
Adapte aux applications qui extraient de
linformation dun document
LAPI DOM :
Construit une reprsentation du document
en mmoire sous forme darbre
Adapte aux applications qui modifient ou
traitent dans leur globalit un document.

DOM et Sax p.3/33

DOM et SaX
Toutes les applications XML passent par une
phase pralable danalyse
Processeur XSLT
Parseur
DOM
Document
XML

Parseur
SaX

Editeur XML
...

flux
de donnes

Base de donnes
Dclenchement
doprations

DOM et Sax p.4/33

LAPI SAX

DOM et Sax p.5/33

Architecture SAX
Associer des vnements aux balises :
Document
XML

Parseur SAX
Evnements
<ELT1> </ELT1> <ELT2>

...
Accumulateur
Donnes

Fonctions

DOM et Sax p.6/33

Les vnements SAX


Dbut et fin de document
Dbut et fin dlment
Instructions de traitements
Commentaires
...
Les fonctions sexcutent indpendamment =>
il faut leur faire partager une zone mmoire
( accumulateur )

DOM et Sax p.7/33

Exemple type : insertion dans une BD


partir dun flux XML contenant des films :
<FILMS>
...
<FILM>
<TITRE>Alien</TITRE>
<ANNEE>1979</ANNEE>
<AUTEUR>Ridley Scott</AUTEUR>
<GENRE>Science-fiction</GENRE
<PAYS>USA</PAYS>
</FILM>
...
</FILMS>

DOM et Sax p.8/33

Les vnements
Dbut de document : connexion la base
Balise <FILM> : cration dun
enregistrement Film
Balise <TITRE> : on affecte Film.titre
Balise <ANNEE> : on affecte Film.annee
etc..
Balise </FILM> : insertion de
lenregistrement dans la base

DOM et Sax p.9/33

Forme arborescente : le modle


DOM

DOM et Sax p.10/33

Quelques mots sur DOM


DOM est une recommandation du W3C. Elle
tient lieu de norme, mais
Cest une spcification trs abstraite : il peut
y avoir des variantes selon les implantations
DOM est issu dune pratique de
programmation pas toujours trs propre du
point de vue OO
les exemples sont bass sur limplantation de
la fondation XML/Apache.

DOM et Sax p.11/33

LAPI oriente-objet DOM


Un parseur DOM prend en entre un document
XML et construit :
un arbre form dobjets
chaque objet appartient une sous-classe
de Node
des oprations sur ces objets permettent de
crer de nouveaux nuds, ou de naviguer
dans le document
=> diteurs XML, processeurs XSLT

DOM et Sax p.12/33

DOM : reprsentation objet des arbres


Un parseur DOM construit en mmoire une
reprsentation du document o :
chaque nud est un objet de type Node ;
chaque catgorie syntaxique est reprsente
par un sous-type de Node ;
la racine du document est un nud spcial,
de type Document.

DOM et Sax p.13/33

Exemple dune reprsentation DOM


Document
-

Element
FILM

Attr
TITRE
Vertigo

Attr
ANNEE
1958

Element
RESUME

Texte
Scottie ...

Element
GENRE

Comment
genre du film

Texte
Drame

DOM et Sax p.14/33

Principales classes DOM


Node

Attribute

TreeNode

Container

Leaf

Notation

Character
Data

Comment

Processing
Instruction

Entity

Document

Entity
Reference

Element

Document
Type

Text

CData
Section

DOM et Sax p.15/33

La super-classe Node
Une approche faiblement objet
Tout nud DOM est un Node
En principe les proprits spcifiques un
sous-type devraient apparatre au niveau de
ce sous-type
Exemple : le nom, valable pour un nud
Element, pas pour un nud Text
En pratique Node rassemble toutes les
proprits de tous les types de nuds

DOM et Sax p.16/33

Proprits du type Node


Proprit

Type

Proprit

Type

nodeType

short

nodeName

String

nodeValue

String

parentNode

Node

firstChild

Node

lastChild

Node

childNodes

NodeList

previousSibling

Node

nextSibling

Node

attributes

NamedNodeMap

DOM et Sax p.17/33

Proprits nodeName et nodeValue


Type de nud

nodeName

nodeValue

CDATASection

#cdata-section

contenu de la section CDATA

Comment

#comment

contenu du commentaire

Document

#document

NULL

DocumentType

nom de la DTD

NULL

Element

nom de llment

NULL

ProcessingInstruction

nom de la cible

le contenu (moins la cible)

Text

#text

contenu du nud Text

Entity

nom de lentit

NULL

EntityReference

nom de lentit rfrence

NULL

Attr

nom de lattribut

valeur de lattribut

Table 1:

DOM et Sax p.18/33

Oprations du type Node


Quelques exemples :
insertBefore (Node nouv,
Node fils)
replaceChild (Node nouv,
Node ancien)
removeChild (Node fils)
appendChild (Node fils)
boolean hasChildNodes()

DOM et Sax p.19/33

La classe Document
Reprsente la racine du document. Cest
toujours le premier nud cr.
Il contient ventuellement une rfrence vers
la DTD
Il sert dusine crer de nouveaux
nuds avec les mthodes
createElement(), createTextNode(),
createComment(), etc

DOM et Sax p.20/33

Un exemple de programme DOM


Le programme Preordre.java prend en argument
un nom de fichier contenant un document XML.
Il analyse ce document avec un parseur
DOM
Il parcourt ensuite les nuds du document
et numrote les nuds de type Text par leur
position dans larbre
Enfin le document modifi est srialis.
implantation avec le parseur Xerces

DOM et Sax p.21/33

Structure du programme

// Import des classes Java


import java.io.*, javax.xml.parsers.*,
org.w3c.dom.*;
import org.apache.xalan.serialize.*;
import org.apache.xml.serialize.*;
class Preordre
{
public static void main (String args [])
{
// Instanciation du parseur, analyse
// du document, parcours
}
private static int Parcours (Node noeud, int n
{
// Fonction de parcours et numrotation
}
}

DOM et Sax p.22/33

Phase danalyse
// Rcupration du document
File fdom = new File (args[0]);
// Instanciation du parseur
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
factory.newDocumentBuilder();
// Analyse du document
Document dom = builder.parse(fdom);
// Dbut du parcours avec le numro 1
Node elementRacine =
dom.getDocumentElement();
Parcours (elementRacine, 1);

DOM et Sax p.23/33

Parcours : numrotation
private static int Parcours (Node noeud,
int numero)
{
String str = new String();
numero++;
// Numrotation du noeud sil est de
// type texte
if (noeud.getNodeType() == Node.TEXT_NODE)
{
str = "(" + numero + ") "
+ noeud.getNodeValue();
noeud.setNodeValue (str);
}
...

DOM et Sax p.24/33

Parcours : rcursion
...
// Parcours rcursif si le noeud a des fils
if (noeud.hasChildNodes())
{
// Rcupre la liste des fils du
// noeud courant (liste de type NodeList)
NodeList fils = noeud.getChildNodes();
// Parcours de la liste et appel rcursif
for (int i=0; i < fils.getLength(); i++)
numero = Parcours (fils.item(i), numero);
}
return numero;
}

DOM et Sax p.25/33

Srialisation
la fin du traitement DOM, le document modifi
est srialis (par exemple pour tre stock)
// Instanciation du serialiseur Xalan
XMLSerializer ser = new XMLSerializer ();
// Dfinition du fichier de sortie
ser.setOutputByteStream(System.out);
// Srialisation du document DOM
ser.serialize(dom);

il existe plusieurs srialisations possibles pour


un mme document.

DOM et Sax p.26/33

Exemple : un document DOM


Document
-

Element
A

Comment
commentaire

Element
B

Element
C

Texte
Texte

Element
D

Texte
Condition: 1 < 2

DOM et Sax p.27/33

Une premire version srialise


Tout est inclus dans le mme fichier, avec une
rfrence une entit.
<?xml version=1.0?>
<A>
<!-- commentaire -->
<B>Texte</B>
<C>
<D>Condition: 1 &#60; 2</D>
</C>
</A>

DOM et Sax p.28/33

Seconde version
Tout est inclus dans le mme fichier, avec une
section CDATA
<?xml version=1.0?>
<A>
<!-- commentaire -->
<B>Texte</B>
<C>
<D>Condition: <![CDATA[1 < 2]]></D>
</C>
</A>

DOM et Sax p.29/33

Troisime version
Une partie du document est insr par rfrence
une entit externe.
<?xml version=1.0?>
<!DOCTYPE A [
<!ENTITY file
SYSTEM "ExXMLArbreB.xml">
]>
<A>
<!-- commentaire -->
<B>Texte</B>
&file;
</A>

DOM et Sax p.30/33

Serialiseur : construction
public class Serialiseur
{
Document doc;
Node elementRacine;
// Constructeur de la classe
public Serialiseur (Document argdoc)
{
doc = argdoc;
// On prend la racine du document
elementRacine = doc.getDocumentElement();
}

DOM et Sax p.31/33

Serialiseur : sortie

// Mthode publique pour sraliser dans un fic


public void sortie (String nomFichier)
throws IOException
{
FileWriter fichier = null;
fichier = new FileWriter (nomFichier);
fichier.write
("<?xml version=\"1.0\" encoding=\"ISO-8859// Parcours rcursif
this.parcours (fichier, elementRacine);
fichier.close();
}

DOM et Sax p.32/33

Serialiseur : parcours

private void parcours (FileWriter fichier,


Node noeud) throws IOException
{
// Traitement des noeuds de type ELEMENT
if (noeud.getNodeType() == Node.ELEMENT_NODE)
{
// On cre la balise ouvrante
fichier.write ("<" + noeud.getNodeName()
+ this.serialiserAttrs(noeud)
+ ">");
// Parcours rcursif si le noeud a des fils
if (noeud.hasChildNodes()) { ... }
// Et la balise fermante
fichier.write ("</" + noeud.getNodeName() +
}

DOM et Sax p.33/33

Vous aimerez peut-être aussi