Vous êtes sur la page 1sur 49

Les interfaces de

programmation XML

Dr Konan Marcellin BROU


marcellin.brou@inphb.ci
konanmarcellin@yahoo.fr

2017-2018
Sommaire
 Introduction
 DOM
 SAX
 Liens utiles

K. M. BROU Technologies XML 2


I. Introduction
 1.1. XML : eXtensible Markup Language
 Généralisation de HTML (HyperText Markup Language)
 Jeu de balises prédéfinies ayant une signification prédéfinie.
 Pas d’extension possible des balises.
 XML : l'auteur peut "inventer" ses propres balises.
 But de XML
 Faciliter le traitement automatisé de documents et de données.
 Structurer les informations :
 Pour qu’elles puissent être lues par des personnes sur le web ;
 Pour qu’elles puissent être traitées par des applications de manière
automatisée.

K. M. BROU Technologies XML 3


I. Introduction
 1.2. XML : une sorte de SGBD ?
 Points communs
 Le stockage : document XML
 Les schémas : DTD, XML schéma
 Langages de requête : XPath, XQL, XQuery…
 Des interfaces de programmation :
 SAX : Simple API for XML
 DOM : Document Object Model
 JDOM : Java Document Object Model
 Inconvénients :
 Stockage inefficace
 Pas d’indexes
 Pas de sécurité
 Pas de transactions
 Pas de contraintes d’intégrité des données
 Pas d’accès multi-utilisateurs
 Pas de triggers
K. M. BROU Technologies XML 4
I. Introduction
 1.3. Solutions aux inconvénients
 Stockage dans une BD relationnelle
 Pour documents orientés données
 Structure régulière, fixe et prévisible
 Stockage dans une BD native
 Véritable système de gestion de BD XML
 Pour documents orientés documents
 Structure irrégulière, fixe et imprévisible
 Spécifique pour stocker des documents XML
 Document XML  Ligne
 Collection de documents  Table
 Supporte :
 Transactions ;
 Sécurité ;
 Accès concurrent ;
 Langage de requête ;
 Intégrité des documents ;
 Indexes.
K. M. BROU Technologies XML 5
I. Introduction
 1.4. Comment interroger des documents XML?
 Solutions : langages de requêtes
 SQL : il faut stocker XML dans une BD relationnel
 Langage des SGBD natives
 Langages des interfaces de programmation SAX, DOM, JDOM :
 PHP, C, C++, Java, Javascript, C#, VB, Python
 XPath : extraction de fragments d’arbres
 XSLT : extraction + transformation (règles)
 LOREL (UC Stanford) : extension de OQL avec les expressions
de chemins
 SQLX (PRiSM) : extension de SQL avec les expressions de
chemins
 XML-QL (AT&T) : pattern XML de recherche et composition
 XQL (MS) : URL dopées aux expressions régulières
 XSQL (Oracle) : SQL3 avec résultats XML
 XQuery (draft W3C ) : vrai langage de requêtes pour XML

K. M. BROU Technologies XML 6


II. DOM
 2.1. Présentation
 DOM : Document Object Modele
 Définit la structure d'un document sous forme d'une hiérarchie
d'objets, afin de simplifier l'accès aux éléments de ce document
 qui permet la manipulation d'un document XML, représenté
sous la forme d'un arbre en mémoire.
 API (Application Programming Interface) indépendant de toute
plateforme et de tout langage, permettant à une application de
parcourir la structure du document et d'agir dynamiquement
sur celui-ci
 Créer, déplacer, ajouter, et modifier des nœuds;
 Ajouter et modifier des attributs, des nœuds fils,
 Détruire des nœuds, etc.
 API Standard du W3C implémentée dans la plupart des
langages (PHP, C, C++, Java, Javascript, C#, VB, Python).

K. M. BROU Technologies XML 7


II. DOM
 Standard W3C fait pour HTML et XML
 DOM niveau 1 : Noyau, HTML
 DOM niveau 2 (2000) : Namespaces, vues, événements, styles,
parcours
 DOM niveau 3 (2002) : Schémas, XPath, entrées/sorties
 Spécification multi-plateformes et multi-langages.
 DOM est orienté objet : classes, attributs et méthodes

K. M. BROU Technologies XML 8


II. DOM
 2.2. Comment travaille DOM
 Présente les documents sous forme d'une hiérarchie
d'objets.
 Exemple : bib.xml
<?xml version="1.0" encoding="ISO-8859-1" standalone = "no" ?>
<?DOCTYPE bib SYSTEM bib.dtd ?>
<bib>
<book id="b1" year="1994">
<title>TCP/IP Illustrated</title>
<author><last>Stevens</last><first>W.</first></author>
<publisher>Addison-Wesley</publisher>
<price> 65.95</price>
</book>
<book id="b2" year="1992">
<title>Advanced Programming in the Unix environment</title>
<author><last>Stevens</last><first>W.</first></author>
<publisher>Addison-Wesley</publisher>
<price>65.95</price>
</book>
K. M. BROU Technologies XML 9
II. DOM
<book id="b3" year="2000">
<title>Data on the Web</title>
<author><last>Abiteboul</last><first>Serge</first></author>
<author><last>Buneman</last><first>Peter</first></author>
<author><last>Suciu</last><first>Dan</first></author>
<publisher>Morgan Kaufmann Publishers</publisher>
<price>39.95</price>
</book>
<book id="b4" year="1999">
<title>The Economics of Technology and Content for ...</title>
<editor>
<last>Gerbarg</last><first>Darcy</first>
<affiliation>CITI</affiliation>
</editor>
<publisher>Kluwer Academic Publishers</publisher>
<price>129.95</price>
</book>
</bib>

K. M. BROU Technologies XML 10


II. DOM
 Arbre de bib.xml
DOCUMENT

bib

book book

id year title author publisher price

b1 1994 TCT/IP last firt Addison 65.95


Illustred -Wesley

Stevens W.

K. M. BROU Technologies XML 11


II. DOM
 2.3. L'API DOM : classes, attributs et méthodes
 DomNode : Représentation d’un nœud générique
Méthode Explication
appendChild(DomNode new) ajoute un noeud fils
hasAtributes() teste si le noeud possède des attributs
hasChildNodes() teste si le noeud possède des enfants
insertBefore(DomNode new,DomNode ref) ajoute un noeud avant un noeud
particulier
removeChild(DomNode) supprime un noeud fils
replaceChild(DomNode new, Domnode old) remplace un nœud par un autre

Attribut Explication Types de Noeuds (nodeType)


XML_ELEMENT_NODE => DOMElement
nodeName nom
XML_ATTRIBUTE_NODE => DOMAttr
nodeValue valeur
XML_TEXT_NODE => DOMText
nodeType type de noeud
XML_CDATA_SECTION_NODE => DOMCharacterData
childNodes retourne une DomNodeList
XML_ENTITY_REF_NODE => DOMEntityReference
contenant les nœuds fils XML_ENTITY_NODE => DOMEntity
firstChild premier fils (ou NULL) XML_PI_NODE => DOMProcessingInstruction
lastChild dernier fils (ou NULL) XML_COMMENT_NODE => DOMComment
attributes liste des attributs XML_DOCUMENT_NODE => DOMDocument

K. M. BROU Technologies XML 12


II. DOM
 DomElement : élément XML
 Hérite de DomNode :
Méthode Explication
getAttribute(string name) retourne la valeur d'un attribut
getAttributeNode(string name) retourne le nœud d'un attribut
getElementsByTagName(string name) retourne une liste d'éléments par leur nom de
balise
hasAttribute(string name) vérifie si un attribut existe
removeAttribute(string name) supprime un attribut
setAttribute(string name,string value) ajoute un attribut

 DomNodeList : Liste de noeud


 En PHP, utilisable avec l'instruction foreach
 Hérite de DomNode :
Méthode Explication
item(int i) retourne le nœud à l'index i

Attribut Explication
length nombre de noeuds
K. M. BROU Technologies XML 13
II. DOM
 DomCharacterData : Nœud de type texte
 Hérite de DomNode :
Méthode Explication
appendData(string data) ajoute de la donnée
deleteData(int offset, int count) supprime les données entre offset et
offset+count
insertData(int offset, string data) insère de la donnée à l'offset défini
replaceData(int offset, int count, string data) remplace de la donnée à l'offset défini

Attribut Explication
data Contenu
length longueur

K. M. BROU Technologies XML 14


II. DOM
 DomDocument : classe représentant un document XML
 Hérite de DomNode :

Méthode Explication
createAttribute(string name) retourne un nœud de type DomAttribute
createComment(string data) retourne un nœud de type DomComment
createElement(string name) retourne un nœud de type DomElement
createTextNode(string data) retourne un nœud de type TextNode
getElementById(string id) retourne un noeud dont l'attribut faisant office d'ID
(défini dans la DTD) correspond
getElementsByTagName(string name) retourne une DomNodeList contenant les noeuds
dont le nom de balise correspond
load(string file) charge un fichier xml
loadHTMLFile(string file) charge un fichier html (pas forcemment bien
formé)
save(string file) sauvegarde de l'arbre dans un fichier
saveXML() retourne une chaîne de caractères représentant
l'arbre
validate() valide un document XML en se basant sur sa DTD

K. M. BROU Technologies XML 15


II. DOM
 DOMXPath : classe représentant un document XML
 XPATH est un pseudo-langage qui permet d'effectuer des
requêtes sur l'arbre.
 Permet d’obtenir des nœuds en fonction de leur chemin dans le
document.

Méthode Explication
DOMXPath(DomDocument doc) Constructeur, construit un objet DOMXPath à
partir du document.
query(string path,DomNode racine) effectue une requête sur le document, et retourne
une DOMNodeList (si 'racine' est précisée, elle
devient la racine du chemin)
evaluate(string path,DomNode racine) effectue une requête sur le document, et retourne
une valeur ou une DOMNodeList (si 'racine' est
précisée, elle devient la racine du chemin)

K. M. BROU Technologies XML 16


II. DOM
 Exemples de syntaxes XPATH

/AAA : sélectionne tous les noeuds AAA de la racine


//AAA : sélectionne tous les noeuds AAA du document
/AAA/BBB/CCC/* : sélectionne tous les noeuds fils du chemin donné
/AAA/BBB[1] : sélectionne le premier noeud BBB du chemin donné
/AAA/BBB[last()] : sélectionne le dernier noeud BBB du chemin donné
/AAA/BBB | //CCC : sélectionne tous les noeuds du chemin /AAA/BBB et les noeuds CCC
//@attr : sélectionne tous les attributs nommés 'attr'
//AAA[@attr] : sélectionne tous les noeuds AAA qui ont l'attribut 'attr'
//AAA[@*] : sélectionne tous les noeuds AAA qui ont des attributs
//AAA[not(@*)] : sélectionne tous les noeuds AAA qui n'ont pas d'attributs
//AAA[@name='valeur'] : sélectionne tous les noeuds AAA dont l'attribut 'name' vaut 'valeur'
//[count(AAA)=2] : sélectionne tous les noeuds ayant 2 fils de type AAA
//[count(*)=2]< : sélectionne tous les noeuds ayant 2 enfants
//[starts-with(name(),'A')] : sélectionne tous les noeuds dont le nom commence par A
//[contains(name(),'A')] : sélectionne tous les noeuds dont le nom contient A
//[contains(text(),'A')] : sélectionne tous les noeuds dont le contenu contient A
//BBB[position() mod 2 = 0 ] : sélectionne tous les noeuds dont la position est paire

K. M. BROU Technologies XML 17


II. DOM
 2.4 Le document DomDocument
 Permet d’instancier un objet DomDocument
 Syntaxe
 <?php $dom = new DomDocument(); ?>
 2.5. Chargement
 Le constructeur DomDocument() crée un document XML
vierge, sans élément racine :
 On peut créer les nouveaux éléments de toutes pièces ;
 Ou bien de charger un document XML à partir d'un fichier.
 On utilise pour cela le nom du fichier XML, avec son chemin
absolu ou relatif dans le système de fichiers.
 Chargement d'un fichier XML
 <?php $dom->load('fichier.xml'); ?>
 Chargement du document XML à partir d'une variable qui
contient l'arbre XML
 <?php $dom->loadXML($chaineXML); ?>
K. M. BROU Technologies XML 18
II. DOM
 2.6. Enregistrement
 Enregistrement dans un ficher
 <?php $dom->save('nouveauFichier.xml'); ?>
 Enregistrement dans une variable
 <?php $chaineXML = $dom->saveXML(); ?>

K. M. BROU Technologies XML 19


II. DOM
 2.5. Validation d’un document XML
 Validation relativement à une DTD au document XML.
 <?php $dom->validate(); ?>
 Autres méthodes de DomDocument :
 schemaValidate() : validation par rapport à un schéma XML ;
 schemaValidateSource() : validation par rapport à un schéma
dans une chaîne de caractères ;
 relaxNGValidate() : validation par rapport à un document
relaxNG sur le système de fichiers
 relaxNGValidateSource() : validation par rapport à un
document relaxNG dans une chaîne de caractères.
 realaxNG : regular language for XML Next Generation
 Alternative à XML Schema
 Valeur retournée :
 true en cas de succès ;
 false en cas d'échec de la validation.
 des erreurs PHP de niveau Warning sont générées.
K. M. BROU Technologies XML 20
II. DOM
 Exemple : validation de bib2.xml de DTD bib2DTD.dtd
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT bib (book+)>
<!ELEMENT book (title,(author+|editor*),publisher+,price)>
<!ATTLIST book id ID #REQUIRED>
bib2DTD.dtd
<!ATTLIST book year CDATA "">
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (last,first)>
<!ELEMENT last (#PCDATA)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT editor (last,first,affiliation)>
<!ELEMENT affiliation (#PCDATA)>

<?php
$dom = new DomDocument; Créer l’alias DOM pour le chemin :
Validation.php E:\Cours\Cours2011\XML\Support\So
$dom->load("bib2.xml");
$b = $dom->validate(); urce\SourceDOM
if($b) echo "Document valide";
else echo "Document non valide";
?>
K. M. BROU Technologies XML 21
II. DOM
 2.6. L'objet DomNodeList
 Tous les résultats multiples (comprenant des nœuds)
retournés par DOM sont sous la forme d'un objet
DomNodeList.
 Un objet DomNodeList n'est pas un tableau
 Impossible d'accéder à ses membres avec un index entre
crochets.
 La classe DomNodeList implémente l'interface Iterator de
PHP ayant les méthodes current, next, key, valid et rewind.
 On n'utilise en général pas directement ces méthodes, mais en
gros ça veut dire qu'on peut parcourir un Iterator (et donc un
objet DomNodeList) dans une boucle foreach.
 C'est un moyen de récupérer une référence sur un objet d'un
DomNodeList.
 Autre moyen de parcourir un objet DomNodeList
 Méthode item() de DomNodeList
 Elle prend pour unique paramètre un index numérique.
K. M. BROU Technologies XML 22
II. DOM
 Exemple : récupération d'une référence à partir d'un
DomNodeList
 <?php $element = $listeElements->item(0); ?>
 récupère dans $element le premier objet pointé par le
DomNodeList $listeElements.
 Si on fournit un mauvais index, la méthode ne renvoie rien.
 Si on exploite le résultat sans prendre de précautions, on récupère
une erreur du style : Notice: Trying to get property of non-
object

K. M. BROU Technologies XML 23


II. DOM
 2.7. Rechercher et récupérer un élément
 Récupérer l'élément racine du document
 on récupère un objet DomElement, et pas un DomNodeList
 puisqu'il n'y a qu'un seul élément racine.
 Exemple : LireRacine.php
<?php
$dom = new DomDocument;
$dom->load("bib2.xml");
$racine = $dom->documentElement;
echo $racine->nodeName;
?>

 Les objets DomNode et DomElement) ont une propriété


nodeName qui renvoie le nom du nœud.
 Dans le cas d'un élément, c'est le nom de la balise.
 Dans le sens inverse de la propriété documentElement des
objets DomDocument, les éléments ont une propriété
ownerDocument qui est une référence sur le document.
K. M. BROU Technologies XML 24
II. DOM
 Rechercher un élément grâce à un attribut de type ID
 si celui-ci est spécifié dans une DTD associée et si le document
a été validé
 si vous voulez simplement chercher un élément selon la valeur
de son attribut id, il faudrait passer par un objet DomXPath.
 <?php $cible = $dom->getElementById("cible"); ?>
 Rechercher un élément par le nom de la balise
 DomDocument::getElementByTagName() : recherche dans tout
le document
 DomElement::getElementsByTagName() : dans les descendants
de l'élément considéré.
 Ces fonctions retournent un objet DomNodeList.

K. M. BROU Technologies XML 25


II. DOM
 Exemple 1 : Titre des livres (LireNoeud1.php)

<?php
$dom = new DomDocument;
$dom->load("bib2.xml");
$listeBook = $dom->getElementsByTagName('title');
foreach($listeBook as $b)
echo $b->firstChild->nodeValue . "<br />";
?>

K. M. BROU Technologies XML 26


II. DOM
 Exemple 2 : Nom des auteurs du 3e livre (LireNoeud2.php)
 Les indices commencent à partir de zéro
<?php
$dom = new DomDocument;
$dom->load("bib2.xml");
$book = $dom->getElementsByTagName('book')->item(2);
$listeBook1 = $book->getElementsByTagName('last');
foreach($listeBook1 as $b)
echo $b->firstChild->nodeValue . "<br />";
?>

$b->firstChild->nodeValue permet de
récupérer la valeur du nœud textuel fils

K. M. BROU Technologies XML 27


II. DOM
 Exemple 4 : Nom des auteurs de tous les livres
(LireNoeud3.php)
 Les indices commencent à partir de zéro

<?php
$dom = new DomDocument;
$dom->load("bib2.xml");
$listeBook = $dom->getElementsByTagName('book');
foreach($listeBook as $d)
{$listeBook1 = $d->getElementsByTagName('last');
foreach($listeBook1 as $b)
echo $b->firstChild->nodeValue . "<br />";
echo "-------------------<br />";
}
?>

Exercice : titre et nom des auteurs de


tous les livres (LireNoeud4.php)

K. M. BROU Technologies XML 28


II. DOM
 2.8. Lire les attributs
 Méthode DomElement::getAttribute()
 Permet de lire les attributs
 Méthode DomElement::hasAttribute()
 Renvoie un booléen qui dit si l'attribut est présent ou pas.
LireAttribut.php

<?php
$dom = new DomDocument;
$dom->load("bib2.xml");
$listeBook = $dom->
getElementsByTagName('book');
foreach($listeBook as $b)
{echo $b->nodeValue;
if($b->hasAttribute("id"))
echo " - " . $b->getAttribute("id");
echo "<br />";
}
?>
echo $b->nodeValue ;
idem echo $b->firstChild->nodeValue ;
K. M. BROU Technologies XML 29
II. DOM
 2.9. Lire les nœuds textuels
 Attribut nodeValue
 Permet de récupérer la valeur d'un nœud textuel.
 Donne le contenu d’un nœud textuel, ou la valeur d'un attribut.
 Appeler nodeValue sur le parent du nœud textuel revient à
l'appeler sur le nœud textuel lui-même.
 Exemple : Titre des livres (LireNoeudTextuel.php)
<?php
$dom = new DomDocument;
$dom->load("bib2.xml");

$titre = $dom->getElementsByTagName("title");
foreach($titre as $b)
{echo $b->nodeValue ;
//idem echo $b->firstChild->nodeValue ;
echo "<br />";
}
?>

K. M. BROU Technologies XML 30


II. DOM
 2.10. Requête XPath
 DOMXPath(DomDocument doc)

Constructeur, construit un objet DOMXPath à partir du
document.
 query(string path, DomNode racine)

Effectue une requête sur le document, et retourne une
DOMNodeList
 si 'racine' est précisée, elle devient la racine du chemin
 Exemple 1 : Titre des livres
 Requete1.php

<?php
$dom = new DomDocument; // création du document XML
$dom->load("bib22.xml"); //chargement de bib22.xml
$xpath = new DOMXpath($dom);
$nodeList = $xpath->query('/bib/book/title');
foreach ($nodeList as $node)
echo $node->nodeValue . "<br/>";
?>
K. M. BROU Technologies XML 31
II. DOM
 Exemple 2 : Titre du livre d’identifiant b7
 Requete2.php
<?php
$dom = new DomDocument; // création du document XML
$dom->load("bib22.xml"); //chargement de bib22.xml

$xpath = new DOMXpath($dom);


$nodeList = $xpath->query('/bib/book[@id="b7"]/title');

foreach ($nodeList as $node)


echo $node->nodeValue . "<br/>";
?>

K. M. BROU Technologies XML 32


II. DOM
 Exercice : exo1Tab.php
 Afficher tous les élément de bib2.xml. Les auteurs seront dans
un tableau.

K. M. BROU Technologies XML 33


II. DOM
 2.11. Modifier un document
 Créer un nœud élément
 Méthode DomDocument::createElement
 permet, de créer des éléments XML.
 <?php $nouveauTitre = $dom->createElement("title"); ?>
 Créer un nœud textuel
 Méthode DomDocument::createTextNode
 ajouter un nœud textuel à un élément
 <php $titre = $dom->createTextNode(" XML, Langage et
applications "); ?>
 Copie d’un nœud existant
 Méthode DomNode::cloneNode
 Crée un nouveau nœud (de n'importe quelle type) par copie d'un nœud
existant
 <?php $TitreIdentique = $titre->cloneNode(); ?>
 accepte un argument facultatif booléen (FALSE par défaut).
 S'il est à TRUE, tout les nœuds fils seront copiés également, et donc toute
une partie de l'arborescence peut être dupliquée par ce biais.
K. M. BROU Technologies XML 34
II. DOM
 Ajouter un attribut à nouveau nœud
 Méthode DomElement::setAttribute
 Sert à la fois à créer un attribut et à en modifier la valeur.
 Le premier paramètre est le nom de l'attribut, le second est sa valeur.
 <?php $nouveauBook->setAttribute("id", "7"); ?>
 Supprimer un attribut
 Méthode DomElement::removeAttribute
 avec le nom de l'attribut en paramètre
 Insérer un nœud dans un document
 Méthode DomNode::appendChild
 Ajoute le nœud passé en paramètre à la liste des enfants du nœud sur
lequel il est appelé.
 Le script suivant ajoute le nœud textuel $nomPays à notre nouveau nœud
$nouveauPays, et ajoute ensuite celui-ci au nœud "europe".

K. M. BROU Technologies XML 35


II. DOM
 Exemple 1 : Création du document suivant (bib22.xml)
<?xml version="1.0"?>
<book id="b7" year="2007">
<title>Introduction a XML</title>
<author>
<last>BROU</last>
<first>K.</first>
</author>
</book> creerDoc1.php

<?php
$dom = new DomDocument; // constructeur, création d'un document XML

$nouveauBook = $dom->createElement("book"); // création d'un élément book


$nouveauBook->setAttribute("id", "b7"); // création d'un attribut id
$nouveauBook->setAttribute("year", "2007"); // création d'un attribut year

$nouveauTitre = $dom->createElement("title"); // création d'un élément title


$titre = $dom->createTextNode("Introduction à XML");
$nouveauTitre->appendChild($titre);
$nouveauBook->appendChild($nouveauTitre);

K. M. BROU Technologies XML 36


II. DOM
$nouveauAuthor = $dom->createElement("author"); // création d'un élément author

$nouveauLast = $dom->createElement("last"); // création d'un élément last


$nom = $dom->createTextNode("BROU"); //création d'un élément textuel
$nouveauLast->appendChild($nom); //ajout l'élément textuel à l'élément last
$nouveauAuthor->appendChild($nouveauLast); // ajout de l'élément last à author

$nouveauFirst = $dom->createElement("first"); // création d'un élément first


$prenom = $dom->createTextNode("K."); //création d'un élément textuel
$nouveauFirst->appendChild($prenom); //ajout l'élément textuel à l'élément first
$nouveauAuthor->appendChild($nouveauFirst); // ajout de l'élément first à author

$nouveauBook->appendChild($nouveauAuthor);// ajout de l'élément author à book


$dom->appendChild($nouveauBook); //ajout de l'élément book à la racine

$dom->save('bib22.xml'); //sauvegarde dans le fichier bib22.xml


?>

Visualiser le fichier bib22.xml

K. M. BROU Technologies XML 37


II. DOM
 Exemple 2 : Ajouter un nœud au document bib2.xml
 Le nœud est ajouté à la fin du document par défaut
 $racine->appendChild($nouveauBook);

ajouterNoeud.php
<?php
$dom = new DomDocument; // constructeur, création d'un document XML
$dom->load("bib2.xml"); //chargement de bib2.xml
$racine = $dom->documentElement; //noeud racine

$nouveauBook = $dom->createElement("book"); // création d'un élément book


$nouveauBook->setAttribute("id", "b7"); // création d'un attribut id
$nouveauBook->setAttribute("year", "2007"); // création d'un attribut year

$nouveauTitre = $dom->createElement("title"); // création d'un élément title


$titre = $dom->createTextNode("Introduction à XML");
$nouveauTitre->appendChild($titre);
$nouveauBook->appendChild($nouveauTitre);

K. M. BROU Technologies XML 38


II. DOM
$nouveauAuthor = $dom->createElement("author"); // création d'un élément author

$nouveauLast = $dom->createElement("last"); // création d'un élément last


$nom = $dom->createTextNode("BROU"); //création d'un élément textuel
$nouveauLast->appendChild($nom); //ajout l'élément textuel à l'élément last
$nouveauAuthor->appendChild($nouveauLast); // ajout de l'élément last à author

$nouveauFirst = $dom->createElement("first"); // création d'un élément first


$prenom = $dom->createTextNode("K."); //création d'un élément textuel
$nouveauFirst->appendChild($prenom); //ajout l'élément textuel à l'élément first
$nouveauAuthor->appendChild($nouveauFirst); // ajout de l'élément first à author

$nouveauBook->appendChild($nouveauAuthor);// ajout de l'élément author à book


$dom->appendChild($nouveauBook); //ajout de l'élément book à la racine

$racine->appendChild($nouveauBook); //ajout de l'élément book à la racine

$dom->save('bib22.xml'); //sauvegarde dans le fichier bib22.xml


?>
Visualiser le fichier bib22.xml

K. M. BROU Technologies XML 39


II. DOM
 Exemple 3 : Ajouter un nœud avant un autre
 Ajouter livre avant le 3e livre
 $book=$dom->getElementsByTagName("book")->item(1);
 $racine->insertBefore($nouveauBook, $book);
 $racine->insertAfter($nouveauBook, $book); //pb
 à tester ajouterNoeudAvant.php
<?php
$dom = new DomDocument; // constructeur, création d'un document XML
$dom->load("bib2.xml");
$racine = $dom->documentElement;

$nouveauBook = $dom->createElement("book"); // création d'un élément book


$nouveauBook->setAttribute("id", "b7"); // création d'un attribut id
$nouveauBook->setAttribute("year", "2007"); // création d'un attribut year

$nouveauTitre = $dom->createElement("title"); // création d'un élément title


$titre = $dom->createTextNode("Introduction a XML");
$nouveauTitre->appendChild($titre);
$nouveauBook->appendChild($nouveauTitre);

$nouveauAuthor = $dom->createElement("author");
K. M. BROU Technologies XML
// création d'un élément author 40
II. DOM
ajouterNoeudAvant.php

$nouveauLast = $dom->createElement("last"); // création d'un élément last


$nom = $dom->createTextNode("BROU"); //création d'un élément textuel
$nouveauLast->appendChild($nom); //ajout l'élément textuel à l'élément last
$nouveauAuthor->appendChild($nouveauLast); // ajout de l'élément last à author

$nouveauFirst = $dom->createElement("first"); // création d'un élément first


$prenom = $dom->createTextNode("K."); //création d'un élément textuel
$nouveauFirst->appendChild($prenom); //ajout l'élément textuel à l'élément first
$nouveauAuthor->appendChild($nouveauFirst); // ajout de l'élément first à author

$nouveauBook->appendChild($nouveauAuthor);// ajout de l'élément author à book

$book=$dom->getElementsByTagName("book")->item(1); //cherche le 2e livre


$racine->insertBefore($nouveauBook, $book);

$dom->save('bib22.xml'); //sauvegarde dans le fichier bib22.xml


?>

Visualiser le fichier bib22.xml

K. M. BROU Technologies XML 41


II. DOM
 Modifier un nœud
 Méthode DomNode::replaceChild(DomNode new, DomNode old)
 Remplace le fils old par le nouveau nœud spécifié new.
 SI le nouveau nœud est déjà un fils, il ne sera pas ajouté une seconde fois.
Si le remplacement réussi, l'ancien nœud sera retourné.
 Exemple : Remplacer le prénom K. de l’auteur BROU par Konan

modifierNoeud.php
<?php
//creer le nouveau noeud
$domNew = new DomDocument; // constructeur, création d'un document XML

$nouveauFirst = $domNew->createElement("first"); // création d'un élément first


$prenom = $domNew->createTextNode("Konan"); //création d'un élément textuel
$nouveauFirst->appendChild($prenom); //ajout l'élément textuel à l'élément first
$nouveauPrix = $dom->createElement("price"); // création d'un élément price
$prix = $dom->createTextNode("87.55");
$nouveauPrix->appendChild($prix);
$nouveauBook->appendChild($nouveauPrix);

$domNew->appendChild($nouveauFirst); //ajout l'élément textuel à l'élément first


K. M. BROU Technologies XML 42
II. DOM
//localiser l'ancien noeud
$domOld = new DomDocument; // constructeur, création d'un document XML
$domOld->load("bib22.xml"); //chargement de bib22.xml

$xpath = new DOMXpath($domOld);


$nodeList = $xpath->query('/bib/book/author/first');
$oldNode = $nodeList->item(1); //1er auteur

// chargement du noeud nouveauFirst dans le document courant


$newNode = $domOld->importNode($domNew->documentElement, true);

// Remplacement
$oldNode->parentNode->replaceChild($newNode, $oldNode);

$domOld->save('bib22.xml'); //sauvegarde dans le fichier bib22.xml


?>

Visualiser le fichier bib22.xml

K. M. BROU Technologies XML 43


II. DOM
 Supprimer un nœud
 Méthode DomNode::removeChild()
 en l'appelant sur le parent du nœud à supprimer et en passant en
paramètre une référence sur le nœud à supprimer.
 tous les descendants du nœud supprimé seront également supprimés.
 Supprimer le livre en 7e position

<?php
$dom = new DomDocument; // constructeur, création d'un document XML
$dom->load("bib22.xml"); //chargement de bib22.xml
$racine = $dom->documentElement;
$book = $dom->getElementsByTagName("book")->item(6); //recherche du 7e livre
$racine->removeChild($book); //suppression du noeud
$dom->save('bib22.xml'); //sauvegarde dans le fichier bib22.xml
?>

Visualiser le fichier bib22.xml

K. M. BROU Technologies XML 44


II. DOM
 Exercice
 Ajouter un deuxième auteur de nom BROU et de prénom K. au
livre "Advanced Programming in the Unix environment" dans le
document bib2.xml.

K. M. BROU Technologies XML 45


III. SAX
 3.1. Présentation
 SAX : Simple API for XML.
 API a été développée par David Megginson.
 C’est un parseur qui utilise des événements pour piloter le
traitement d'un document XML.
 Une application utilisant SAX implémente généralement
des gestionnaires d'événements, lui permettant d'effectuer
des opérations selon le type d'élément rencontré.
 Ces gestionnaires sont objets (handler en anglais).

Application Document source

Event Parser
Handler

 Les classes de l'API SAX sont regroupées dans le package


org.xml.sax
K. M. BROU Technologies XML 46
III. SAX
 3.2. Processus
 Soit le document suivant
<personne>
<nom>Toto</nom>
<prenom>Ali</prenom>
</personne>
 Evénement généré
start document
start element: personne
start element: nom
characters: Toto
end element: nom
start element: prenom
characters: Ali
end element: prenom
end element: personne
 Remarque end document
 Une application basée sur SAX peut gérer uniquement les
éléments dont elle a besoin sans avoir à construire en mémoire
la totalité de l’arbre du document comme DOM.
K. M. BROU Technologies XML 47
III. SAX
 3.3. Les interfaces de l’API
 Quelques interfaces :
Interface Méthode Explication
DocumentHandler Ses méthodes retournent des événements liés au
document.
startDocument() Retourne un événement lié à l'ouverture du
document.
startElement() Retourne un événement lié à la rencontre d'un
nouvel élément.
characters() Retourne les caractères rencontrés
endElement() Retourne un événement lié à la fin d'un élément
endDocument() Retourne un événement lié à la fermeture du
document
ErrorHandler Ses méthodes retournant des événements relatifs
aux erreurs ou aux avertissements
DTDHandler Retourne des événements relatifs à la lecture de la
DTD du document XML
EntityResolver Retourne une URL lorsqu'une URI est rencontrée
K. M. BROU Technologies XML 48
Bibliographie
 Livres
 "XML, Langage et applications", Alain Michard, Eyrolles.
 Webographie
 Gestion du XML en PHP 5 : utiliser DOM
 http://smeric.developpez.com/java/cours/xml/sax/
 ftp://ftp-
developpez.com/eusebius/php5dom/php5dom.pdf
 Tutoriel DOM et JDOM
 http://www-lium.univ-
lemans.fr/~lehuen/master1/xml/doc/Tutoriel%20DOM%20et
%20JDOM.pdf
 http://durand.iut-amiens.fr/mcr51:cours:dom
 http://cynober.developpez.com/tutoriel/java/xml/jdom/

K. M. BROU Technologies XML 49

Vous aimerez peut-être aussi