XMLAPI
1
Manipuler XML
Comment manipuler un document XML dans un
programme?
• Très bas niveau : analyse syntaxique
• Bas niveau : validation
• Niveau intermédiaire:
• Manipulation du document chargé en mémoire
• Sauvegarde d’un document
• Haut niveau:
• Sérialisation
• Transformation
•… 2
Manipuler XML
3
SAX
4
SAX
• Simple API for XML : une API simple pour
réagir sur le contenu et la structure d’un
document
• Le document est vu comme une suite
d’événements qui surviennent lors de la lecture
séquentielle du document
5
SAX
• Développement communautaire
– xmldev mailing list
• Modèle événementiel: événements d’analyse
syntaxique
• Bas niveau
• Efficace
• Délicat à mettre en oeuvre
6
SAX
• Langage de référence : Java notamment dans
JAXP (packages [Link], [Link], [Link],
[Link], inclus dans JDK depuis la version 1.4)
• De Nombreuses autres implémentations
– Xerces : Java, C++, COM, Perl
– Microsoft : Binding COM, et donc C,C++,VB
– Support en Python, Perl, PHP, etc
• Proposé par le groupe [Link] ([Link]
7
Fonctionnement de SAX
• Un modèle événementiel
• Principe
– Un document est transformé en un flux d’événements
syntaxiques (balise ouvrante, fermante …)
– A chaque événement, un callback est appelé dans l’ordre
d’apparition dans le document
– Aucune mémoire
– Une application est un écouteur d’événements
– Parcours préfixé en profondeur de l’arbre
– Lecture seule
8
Fonctionnement de SAX
9
Principe de SAX
• StartDocument
• startElement: cours
• startElement: titre
• characters: « XML API »
• endElement: titre
• startElement: auteur
• startElement: nom
• characters: « SECK »
• endElement: nom
• startElement: prénom
• characters: « alioune »
• endElement: prénom
• startElement: description
• charactere: « ce cours aborde
les » 10
Principe de SAX
• starElement: b
• Characters: « conceptes »
• endElement: b
• characters: « autour de XML »
• endElement: description
• endElement: cours
• endDocument
11
Mécanismes
Tout est basé sur quatre interfaces:
• ContentHandler
– La plus importante
– Réagit aux événements: une méthode par
type d’événement (startElement,…)
• ErrorHandler: gestion des erreur en
particulier les problèmes de validation
12
Mécanisme
• DtdHandler: gestion d’une petite partie
des DTD
• EntityResolver: gestion du remplacement
des entites externes
Les quatre interfaces sont implémentées par
DefaultHandler qui ne fait pas grand chose
13
Fonctionnement d’un analyseur
1. Ouverture du fichier à analyser
2. Lecture d’une partie significative du fichier:
3. Si cette partie
a. Pose un probleme (document mal formé ou non valide), appel
d’une methode du ErrorHandler
b. Est une référence à une entité, appel d’une méthode EntityResolver
c. Est un composant de la DTD, appel d’une méthode de la
DTDHandler
d. Est une balise; du texte, etc., appel d’une méthode du
ContentHandler
4. Si le document n’est pas terminé, retour en 2
14
Les méthodes essentielles
XMLReader ContentHandler
•setContentHandler •startDocument
•setErrorHandler •endElement
•parse •characters
•ndDocument
ErrorHandler
•startElement
•fatalError
•error
•warning
15
Un exemple en Java
16
PHP: SAX
• PHP
– Version 4: basé sur expat
– version 5: basé sur libxml
– Transparent pour l’utilisateur
• Quelques fonctions
– xml_parser_create
– xml_set_element_handler
– xml_set_character_data_handler
17
Exemple pratique
• Installer Xamp
• Lancer apache
• Créer une page php qui parse un document
xml
18
Emplacement dans l’arbre
• Une feuille peut être traduite par plusieurs
événements characters
• Toutes les méthodes n’ont aucun moyen
automatique de connaître leurs contextes
• Comment connaître le contexte d’un
événement?
• Réponse :pas de solution automatique =>
programmation au cas par cas
19
Contexte d’un événement
• Cas général
– On utilise une pile
– Chaque balise ouvrante empile un élément
– Chaque balise fermante dépile un élément
– À tout moment la pile contient la branche de
l’arbre contexte d’un événement
– La localisation reste limité
• Pas de prise en compte de l’ordre dans la fratrie
• Plus généralement du contexte d’un nœud excepté
les parents
20
DOM
21
DOM
• Document Object Model
• Standard W3C fait pour HTML & XML
• Structure d’objets pour représenter un document
– Résultat d’un parser
– Arbre d’objets reliés entre eux
• Interface d’objets pour naviguer entre eux
– Orienté Objet
– Peut etre utiliser en:
• Java (JAXP) , C++, Corba(IDL)
• C#,VB
• Python, PHP
22
Quelques parsers
Document
XML
Xerces Apache
(Java,C++) Parseur DOM
MSXML Microsoft
SDK Oracle Oracle
Arbre DOM
JAXP,J2EE Sun
API DOM
Application
23
Caractéristiques majeurs
• Modèle objet
• Haut niveau
• Très riche, de nombreux outils
• Coûteux: document entièrement en
mémoire
• Généralement construit au dessus de SAX
24
DOM : un modèle par arbre
Principe
• Un document est transformé en un objet
Document
• Un Document possède quelques fils:
• Un Element : la racine du document
• Divers élément top level: commentaire, processing
instruction et DTD
• La structure de l’arbre est obtenue grâce aux
• Elements:
• Un Element possede éventuellement des fils Element
• ou Text
• Un Element possède éventuellement des attributs
• DOM définit toutes les interfaces de
manipulations de l’arbre et de son contenu
25
Exemple d’arbre DOM
Racin du document
Element <Cours>
Document
NodeList
Element
Attr
<Titre> Id= " C1"
NamedNodeMap
NodeList
Text XMLAPI
26
Exemple d’arbre DOM
Document Racine du document
NodeList
Element <Cours>
<Cours>
NodeList
<Titre id="C1">
XMLAPI Element <Titre>
</Titre>
</Cours> NamedNodeMap
Attr Id= " C1"
NodeList
Text XMLAPI
27
Diagramme des interfaces (partiel)
28
Remarques
• Il y a d’autres classes (DocumentType,
EntityReference, etc.)
• L’héritage est « déroutant »
– Certaines méthodes de NODE n’ont pas
vraiment de sens à ce niveau
• getNodeName
• getNodeValue
– Le typage se fait par une constante de type
short: getNodeType()
29
Quelques interfaces de base
• Document • Nœud
– createElement (Nom_Element): – insertBefore (Nouveau_Noeud,
• créer un élément avec le nom Noeud_Reference):
spécifié en paramètre. • insère un nouveau nœud fils avant le
" nœud référence" déjà existant.
– createComment (commentaire):
– replaceChild (Nouveau_Noeud,
• créer une ligne de commentaires
Ancien_Noeud):
dans le document.
• remplace le nœud "Ancien_Noeud"
– createAttribute (Nom_Attribut): par le nœud "Nouveau_Noeud".
• créer un attribut avec le nom pris en – removeChild (Nœud):
paramètre. • supprime le nœud entré en paramètre
– getElementsByTagName de la liste des nœuds.
(nom_Tag): – appendChild (Nouveau_Noeud):
• retourne tous les descendants des • Ajoute un nouveau nœud a la fin de
éléments correspondants au la liste des nœuds.
Nom_Tag. – hasChildNodes():
• Retourne vrai si le nœud possède un
enfant
30
Autres Interfaces
• Interfaces fondamentales • Interfaces étendues
– DOMImplementation XML
– Document – ProcessingInstruction
– Comment – DocumentType
– DocumentFragment
– CDATASection
– Element
– Notation
– Attr(ibute)
– Entity
– NamedNodeMap
–
– EntityReference
CharacterData
• Comment
• Text
31
Quelques interfaces en JAVA
32
Quelques interfaces en JAVA
33
Quelques interfaces en JAVA
34
DOM: Exemple en java
• Faire un exemple d’utilisation de DOM
avec java
35
Bilan DOM
• Une interface objet standard
– Navigation dans l’arbre XML
– Traitement spécifiques
• Performance limité
– Place mémoire importante
– Traitement à la fin de l’analyse
36
DOM versus SAX
• DOM utilise SAX pour la
construction de l’arbre d’un
document XML
• SAX est plus léger que
DOM
• Au dessus de DOM il est
possible d’implémenter des
méthodes caller
37
API JAXP
38
API JAXP
39
API JAXP
40