MANIPULATION DES
DOCUMENTS XML
XPATH- VOCABULAIRE
(EXEMPLE)
ARBRE XML
Légende (les
composants)
DOCUMENT OBJECT
MODEL (DOM)
QU’EST-CE QUE L’API DOM ?
Un parseur XML est un logiciel qui permettent de lire des
documents XML.
Le DOM XML (Document Object Model) définit les propriétés et les
méthodes d'accès et d'édition des documents XML. Cependant,
avant de pouvoir accéder à un document XML, celui-ci doit être
chargé dans un objet DOM XML- le document est représenté en
mémoire sous la forme d’un arbre.
DOM est indépendante de toute plate-forme ou langage de
programmation.
Tous les navigateurs modernes disposent d'un analyseur XML
intégré qui peut convertir le texte en un objet DOM XML.
LE VOCABULAIRE ET
LES PRINCIPAUX
ÉLÉMENTS
TABLE RÉCAPITULATIF
Instanc Definition Classe/Méthodes
e
Il désigne un document XML Exploiter le prologue et le corps de
composé d’un prologue et documents XML.
Docume Créer ou modifier des documents xml.
d’un corps.
nt Ajouter des éléments, des commentaires, des
attributs, etc.
l’élément de base d’un arbre Obtenir le type du nœud (attribut, valeur,
XML. Ainsi, Toute branche ou etc.) son nom, sa valeur, la liste des nœuds
feuille est un nœud. Un fils, le nœud parent, etc.
Node Créer, supprimer et modifier un nœud, ou
élément est donc un nœud,
tout comme une valeur et un d’en remplacer un par un autre, etc.
attribut.
Un Element représente une Fournir le nom de la balise.
balise d’un document XML. Récupérer les informations d’un attribut ou la
Element
listes des nœuds d’un élément portant un
nom spécifique.
Un Attr désigne un attribut. Fournir un certain nombre d’informations
concernant les attributs comme son nom ou
Attr
encore sa valeur.
LES AUTRES ÉLÉMENTS
Concernant les éléments non décrits, il existe par exemple la classe
Comment permettant de gérer les commentaires ou encore la
classe CDATASection permettant d’exploiter les sections CDATA
d’un document XML.
Finalement, grâce à DOM, il est également possible de vérifier la
validité d’un document XML à une définition DTD ou un Schéma
XML.
XPATH
QU’EST-CE QUE L’API
XPATH ?
XPath est une technologie qui permet d’extraire des informations
d’un document XML via l’écriture d’expressions. Concrètement, ces
expressions consistent à décrire le chemin emprunté dans l’arbre
XML pour atteindre les données qui nous intéressent.
Tout comme DOM, XPath est un standard du W3C et ce depuis sa
première version en 1999.
VOCABULAIRE-XPATH
Noeud type Exemple
Le parent d’un nœud est le nœud qui Le nœud repertoire est le parent du
PARENT est directement au dessus de lui nœud personne qui est lui même le parent
d’un point de vue hiérarchique. des nœuds nom, prenom et telephones.
Un nœud a pour enfants tous les
Le nœud repertoire a pour enfant le nœud
nœuds situés au niveau en dessous
ENFANT personne qui a lui même plusieurs enfants :
dans la hiérarchie. Un nœud peut
les nœuds nom, prenom et telephones.
donc avoir une infinité d’enfants.
Un nœud a pour descendants tous
Le nœud repertoire a pour descendants les
DESCENDA les nœuds situés en dessous dans la
nœuds personne,
NT hiérarchie. Un nœud peut donc avoir
nom, prenom et telephones.
une infinité de descendants.
Un nœud a pour ancêtres tous les
nœuds situés en dessus dans la Le nœud telephones a pour ancêtres les
ANCÊTRE
hiérarchie. Un nœud peut donc avoir nœuds personne et repertoire.
plusieurs ancêtres.
Un nœud a pour frères tous les
nœuds situés au même niveau dans Le nœud nom a pour frères les nœuds
FRÈRE
la hiérarchie. Un nœud peut donc prenom et telephones.
avoir une infinité de frères.
CHEMIN RELATIF ET CHEMIN
ABSOLU
Si je veux récupérer par exemple le numéro de téléphone fixe, voici le
chemin à parcourir :
Étape 1 : nœud repertoire.
Étape 2 : descendre au nœud enfant personne.
Étape 3 : descendre au nœud enfant telephones.
Étape 4 : descendre au nœud enfant telephone dont l’attribut est fixe.
L’expression XPath correspondante ressemblera à quelque chose comme ça
:
/étape1/étape2/étape3/étape4
Si le principe est toujours le même, il est possible d’exprimer vos chemins
de 2 manières :
Un chemin relatif.
Un chemin absolu.
LES CHEMINS ABSOLUS
Le chemin absolu est le type de chemin que nous avons utilisé dans
notre exemple. Le nœud de départ est toujours la racine de l’arbre XML.
Une expression XPath utilisant un chemin absolu est facilement
identifiable car elle commence par le caractère ”/”.
Nous allons récupérer le prénom de la personne décrite dans notre
arbre XML :
Étape 1 : nœud repertoire.
Étape 2 : descendre au nœud enfant personne.
Étape 3 : descendre au nœud enfant prenom.
L’expression XPath correspondante ressemblera alors à ça :
/étape1/étape2/étape3
LES CHEMINS RELATIFS
Si un chemin absolu est un chemin dont le nœud de départ est toujours la
racine de l’arbre XML, un chemin relatif accepte quant à lui n’importe quel
nœud de l’arbre XML comme point de départ.
Une expression XPath utilisant un chemin relatif n’est pas facilement
identifiable car elle ne commence pas par le caractère ”/”.
Exemple, notre point de départ sera le nœud décrivant le numéro de
téléphone portable de John DOE :
Étape 1 : nœud telephone dont l’attribut est portable.
Étape 2 : remonter au nœud parent telephones.
Étape 3 : aller nœud frère prenom.
L’expression XPath correspondante ressemblera alors à ça :
étape1/étape2/étape3
XPATH - LOCALISER LES
DONNÉES
Pour exploiter facilement les documents XML via XPath, il vaut
mieux aborder toutes les notions qui permettront d’utiliser Xpath.
Une expression XPath est en réalité une succession d’étapes.
Une étape est décrite par 3 éléments : un axe, un nœud ou un type
de nœud et un ou plusieurs prédicats (facultatif). La syntaxe d’une
étape est comme suit:
axe::nœud[predicat][predicat]...[predicat]
DISSECTION D’UNE ÉTAPE
Elemen
Role
t
Permet de définir le sens de la recherche et il est le
premier élément formant une étape. Par exemple, si
Axe
l’on souhaite se diriger vers un nœud enfant ou au
contraire remonter vers un nœud parent voir un
ancêtre.
Permet d’affiner notre recherche en indiquant
Nœud
explicitement le nom d’un nœud ou le type de
nœud dont les informations nous intéressent.
Ces éléments sont facultatifs. Ils agissent comme un
Prédic
filtre. Par exemple possible de sélectionner les
ats
informations à une position précise.
SPÉCIFICATION D’AXE <->ORIENTATION VERS
Nom de Orientation de la Orientation de la
Nom de l'axe
l'axe recherche vers recherche vers
Les ancêtres du nœud Les nœuds suivant le
Ancestor Following
courant nœud courant
Ancestor-or- Le nœud courant et Les frères suivants du
Following-sibling
self ses ancêtres nœud courant
Les attributs du nœud
Attribute Parent Le père du nœud courant
courant
Les enfants du nœud Les nœuds précédant le
Child Preceding
courant nœud courant
Les descendants du Les frères précédents du
Descendant Preceding-sibling
nœud courant nœud courant
Descendant- Le nœud courant et
Self Le nœud courant
or-self ses descendants
Note: il existe également un axe nommé namespace qui permet d’orienter
la recherche vers un espace de noms.
QUELQUES ABRÉVIATIONS
Il est possible d’utiliser des abréviations, afin de rendre la syntaxe
de nos expressions XPath plus claire et concise. Par exemple,
lorsque l’on souhaite orienter la recherche vers l’axe child, ce n’est
pas nécessaire de le préciser. Il s’agit de l’axe par défaut.
SPÉCIFICATION DES NŒUDS-
TABLEAU RÉCAPITULATIF
Nom Description
nom du oriente la recherche vers le nœud dont le nom a
nœud explicitement été spécifié
* oriente la recherche vers tous les nœuds
oriente la recherche vers tous les types de
node()
nœuds (éléments, commentaires, attributs, etc.)
text() oriente la recherche vers les nœuds de type texte
comment oriente la recherche vers les nœuds de type
() commentaire
Note : il existe également d’autres valeurs possibles comme par
exemple processing-instruction().
EXEMPLES D’EXPRESSIONS-
CHEMIN ABSOLU
Dans notre premier exemple, le but va être de récupérer le pays de
domiciliation de John DOE.
Phase Description
Étape 1 : descendre au nœud repertoire .
Décrire les étapes à suivre : Étape 2 : descendre au nœud personne.
Étape 3 : descendre au nœud adresse.
Étape 4 : descendre au nœud pays.
Étape 1 : child::repertoire.
Traduire ces étapes sous la
Étape 2 : child::personne.
forme d’expressions XPath :
Étape 3 : child::adresse.
Étape 4 : child::pays.
/child::repertoire/child::personne/child::adresse/
Etablir le chemin XPath
child::pays
Simplifier l’écriture de cette /repertoire/personne/adresse/pays
expression (l’axe child est celui
EXEMPLE D’EXPRESSIONS-
CHEMIN ABSOLU
Maintenant, le but est de trouver l’expression XPath permettant
de trouver tous les commentaires de notre document XML.
Dans ce nouvel exemple, une seule étape est en réalité nécessaire
et consiste à sélectionner tous les descendants du nœud racine qui
sont des commentaires.
Tentons maintenant de traduire cette étape sous la forme
d’expressions XPath :
On sélectionne tous les descendants avec l’expression descendant.
On filtre les commentaires avec l’expression comment().
Ce qui nous donne :
/descendant::comment()
EXEMPLE D’EXPRESSIONS-
CHEMIN RELATIFS
Dans cet exemple, notre point de départ sera le
nœud telephones. Le but va être de récupérer
le pays de domiciliation de John DOE.
Phase Description
Étape 1 : remonter au nœud
Décrire les étapes à suivre : frère adresse.
Étape 3 : descendre au nœud pays.
Traduisons ces étapes sous
Étape 1 : preceding-sibling::adresse.
la forme d’expressions
Étape 2 : pays.
XPath :
Etablir le chemin XPath //preceding-sibling::adresse/pays
AUTRES ABRÉVIATIONS
Simplifier l’expression- Il est possible de remplacer l’expression: /descendant-
or-self::node()/ par //
Exemple: //pays
L’EXPRESSION SELF::NODE()
Notre deuxième abréviation va nous permettre de remplacer l’expression:
/self::node() par /.
Ainsi, l’expression :
/repertoire/personne/self::node()
peut être simplifiée par :
/repertoire/personne/.
L’EXPRESSION PARENT::NODE()
Notre dernière abréviation va nous permettre de remplacer
l’expression /parent::node()/ par ...
TABLEAU RÉCAPITULATIF-
LES PRÉDICATS
Nom du
Description
prédicat
attribute permet d'affiner la recherche en fonction d'un attribut
count() permet de compter le nombre de nœuds
last() permet de sélectionner le dernier nœud d'une liste
permet d'affiner la recherche en fonction de la
position()
position d'un nœud
Note: il existe également d’autres valeurs possibles comme par
exemple name(), id() ou encore string-length(). Ainsi, un prédicat peut
également contenir une expression XPath correspondant à une étape.
EXEMPLES-PRÉDICATS
(ATTRIBUTS)
Dans notre premier exemple, le but va être de récupérer le nœud
contenant le numéro de téléphone fixe de John DOE.
Bien évidemment, il existe plusieurs façons d’y arriver:
Nous allons sélectionner tous les descendants du nœud racine et
filtrer sur la valeur de l’attribut type. Ce qui nous donne :
/descendant::*[attribute::type="fixe"]
Il est possible de procéder autrement en précisant le chemin
complet :
/repertoire/personne/telephones/telephone[attribute::type="fixe"]
QUELQUES ABRÉVIATIONS
Comme pour les axes, nous n’allons voir ici qu’une seule
abréviation et elle concerne le prédicat attribute qu’il est possible
de remplacer par le symbole @. Ainsi, l’expression :
/repertoire/personne/telephones/telephone[attribute::type="fixe"]
devient :
/repertoire/personne/telephones/telephone[@type="fixe"]
EXEMPLES-PRÉDICATS
(ATTRIBUTS)
Maintenant, en sélectionnant les numéros de téléphones qui ne sont pas des
numéros de téléphones fixes. Une fois de plus, il existe plusieurs façons de
procéder:
La première, qui a priori est la plus simple, consiste à remplacer dans notre
expression précédente l’opérateur d’égalité = par l’opérateur de non
égalité != :
/repertoire/personne/telephones/telephone[attribute::type!="fixe"]
Une autre méthode consiste à utiliser la fonction not() :
/repertoire/personne/telephones/telephone[not(attribute::type="fixe")]
Note : la double négation nous fait revenir à notre point de départ. En effet, les
2 expressions suivantes sont équivalentes :
/repertoire/personne/telephones/telephone[not(attribute::type!="fixe")]/
repertoire/personne/telephones/telephone[attribute::type="fixe"]
EXEMPLES-PRÉDICATS
(POSITIONS)
Après avoir manipulé les attributs, je vous propose maintenant de
manipuler les positions. Ainsi, notre deuxième exemple consiste à
sélectionner le premier numéro de téléphone de John DOE.
Commençons par détailler les étapes : Étape 1 : descendre au nœud repertoire.
Étape 2 : descendre au nœud personne.
Étape 3 : descendre au nœud telephones.
Étape 4 : sélectionner le premier
nœud telephone.
Traduisons maintenant ces étapes sous Étape 1 : repertoire.
la forme d’expressions Xpath. Étape 2 : personne.
Étape 3 : telephones.
Étape 4 : telephone[position()=1].
Sélectionner le premier /repertoire/personne/telephones/
nœud téléphone de la liste telephone[position()=1]
Sélectionner le dernier /repertoire/personne/telephones/
nœud téléphone de la liste telephone[last()]
QUELQUES ABRÉVIATIONS
Comme pour les axes, nous n’allons voir ici qu’une seule
abréviation et elle concerne le prédicat attribute qu’il est possible
de remplacer par le symbole @. Ainsi, l’expression :
/repertoire/personne/telephones/telephone[attribute::type="fixe"]
devient :
/repertoire/personne/telephones/telephone[@type="fixe"]
UN EXEMPLE AVEC EDITIX
Pour conclure, on va voir comment exécuter une expression XPath
avec EditiX.
Commencez par créer dans EditiX un document XML
contenant les informations suivantes :
LA VUE XPATH
Afin de pouvoir exécuter des expressions XPath, nous allons devoir
afficher la vue dédiée au sein de EditiX. Pour ce faire, vous pouvez
sélectionner dans la barre de menu XML puis XPath view ou encore
utiliser le raccourci clavier Ctrl + Shift + 4.
La fenêtre suivante doit alors apparaître :
Comme vous pouvez le constater, cette vue se
compose de plusieurs éléments :
Un champ dans lequel toutes nos expressions seront écrites.
2 boutons permettant de choisir si notre expression utilise
un chemin relatif ou absolu.
Une puce permettant de choisir la version de XPath à utiliser
(prenez l’habitude de travailler avec la version 2).
Des onglets permettant notamment d’afficher les
informations sélectionnées par nos expressions.
EXÉCUTER UNE REQUÊTE
Dans cet ultime exemple, nous allons sélectionner les nœuds
contenant des adresses e-mails professionnelles grâce à
l’expression suivante :
/repertoire/personne/emails/email[attribute::type="professionnel"]
Selon le document XML, nous devrions avoir 2 nœuds sélectionnés.
Vérifions tout de suite :
EXERCICE XPATH
Pour les arbres XPATH suivants, écrire les chemins permettant de localiser les nœuds demandés.
Localiser ces noeuds dans l'arbre.
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD>
<BBB/> </DDD> <CCC/>
</AAA>
1) l'élément racine AAA
2) tous les éléments CCC qui sont enfants de l'élément racine AAA
3) tous les éléments BBB qui sont enfants de DDD, qui sont enfants de l'élément racine AAA