Les interfaces de
programmation XML
Dr Konan Marcellin BROU
[Link]@[Link]
konanmarcellin@[Link]
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 : [Link]
<?xml version="1.0" encoding="ISO-8859-1" standalone = "no" ?>
<?DOCTYPE bib SYSTEM [Link] ?>
<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 [Link]
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('[Link]'); ?>
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('[Link]'); ?>
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 [Link] de DTD [Link]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT bib (book+)>
<!ELEMENT book (title,(author+|editor*),publisher+,price)>
<!ATTLIST book id ID #REQUIRED>
[Link]
<!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 :
[Link] E:\Cours\Cours2011\XML\Support\So
$dom->load("[Link]");
$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 : [Link]
<?php
$dom = new DomDocument;
$dom->load("[Link]");
$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 ([Link])
<?php
$dom = new DomDocument;
$dom->load("[Link]");
$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 ([Link])
Les indices commencent à partir de zéro
<?php
$dom = new DomDocument;
$dom->load("[Link]");
$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
([Link])
Les indices commencent à partir de zéro
<?php
$dom = new DomDocument;
$dom->load("[Link]");
$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 ([Link])
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.
[Link]
<?php
$dom = new DomDocument;
$dom->load("[Link]");
$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 ([Link])
<?php
$dom = new DomDocument;
$dom->load("[Link]");
$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
[Link]
<?php
$dom = new DomDocument; // création du document XML
$dom->load("[Link]"); //chargement de [Link]
$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
[Link]
<?php
$dom = new DomDocument; // création du document XML
$dom->load("[Link]"); //chargement de [Link]
$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 : [Link]
Afficher tous les élément de [Link]. 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 ([Link])
<?xml version="1.0"?>
<book id="b7" year="2007">
<title>Introduction a XML</title>
<author>
<last>BROU</last>
<first>K.</first>
</author>
</book> [Link]
<?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('[Link]'); //sauvegarde dans le fichier [Link]
?>
Visualiser le fichier [Link]
K. M. BROU Technologies XML 37
II. DOM
Exemple 2 : Ajouter un nœud au document [Link]
Le nœud est ajouté à la fin du document par défaut
$racine->appendChild($nouveauBook);
[Link]
<?php
$dom = new DomDocument; // constructeur, création d'un document XML
$dom->load("[Link]"); //chargement de [Link]
$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('[Link]'); //sauvegarde dans le fichier [Link]
?>
Visualiser le fichier [Link]
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 [Link]
<?php
$dom = new DomDocument; // constructeur, création d'un document XML
$dom->load("[Link]");
$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
[Link]
$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('[Link]'); //sauvegarde dans le fichier [Link]
?>
Visualiser le fichier [Link]
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
[Link]
<?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("[Link]"); //chargement de [Link]
$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('[Link]'); //sauvegarde dans le fichier [Link]
?>
Visualiser le fichier [Link]
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("[Link]"); //chargement de [Link]
$racine = $dom->documentElement;
$book = $dom->getElementsByTagName("book")->item(6); //recherche du 7e livre
$racine->removeChild($book); //suppression du noeud
$dom->save('[Link]'); //sauvegarde dans le fichier [Link]
?>
Visualiser le fichier [Link]
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 [Link].
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
[Link]
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
[Link]
[Link]
[Link]/eusebius/php5dom/[Link]
Tutoriel DOM et JDOM
[Link]
[Link]/~lehuen/master1/xml/doc/Tutoriel%20DOM%20et
%[Link]
[Link]
[Link]
K. M. BROU Technologies XML 49