La Syntaxe XPath

Publié dans XML | Marqué avec , , ,
Share

Bonjour tout le monde ! Aujourd’hui nous allons parler d’un outils très utilisé dans le traitement de données XML, J’ai nommé XPath. La syntaxe XPath est notamment utilisée dans certains langages tels que XSLT dont nous parlerons dans un prochain article. On peut citer également XQuery qui joue énormément avec XPath. Voyons de plus près à quoi ca ressemble.

Présentation du langage XPath

Comme son nom l’indique, XPath permet de définir d’écrire des « chemins » (path en anglais). Ces chemins, qui ont une syntaxe particulière, ont pour but la sélection de certaines parties, certains nœuds d’un document XML et ce de manière simplissime. Découvrons ca sur un exemple.

<blog>
	<info>
		<nom>30 minutes par jour</nom>
		<description langue="fr">Un blog qui cause d'informatique</description>
		<url type="internet">http://30minparjour.la-bnbox.fr/</url>
	</info>
	<billets>
		<billet>
			<titre langue="fr">Petit point sur le XML</titre>
			<categorie>XML</categorie>
		</billet>
		<billet>
			<titre langue="fr">En ce début d'année, faisant le point</titre>
			<categorie>Generalité</categorie>
		</billet>
	</billets>
</blog>


Imaginons vous vouliez écrire le chemin XPath correspondant à la requête : « Sélection du noeud ‘nom’ du blog » . Cela sera simplement : « /blog/info/nom ».
Pas trop compliqué jusque là. Continuons sur l’exemple. Vous voulez sélectionner la liste des billets, vous ferez : « /blog/info/billets/billet » Tout chemin peut correspondre à un ou plusieurs éléments. Ici, le Xpath peut aussi bien mener au premier billet, qu’au deuxième. Le Xpath correspond donc à la séquence des deux billets, ou plus généralement à la séquence de tous les nœuds de votre arbre XML pouvant être atteint en suivant ce chemin. Ici :

<billet>
	<titre langue="fr">Petit point sur le XML</titre>
	<categorie>XML</categorie>
</billet>

et

<billet>
	<titre langue="fr">En ce début d'année, faisant le point</titre>
	<categorie>Généralité</categorie>
</billet>

Il est également possible de sélectionner un attribut d’un nœud. Par exemple, si vous voulez la langue de la description du blog, on fera : « /blog/info/description/@langue ». Si vous voulez la séquence des langues des billets : « /blog/billets/billet/@langue ».
Vous l’aurez compris la syntaxe est donc : « x/@attributDuNoeudX »

Remarque

Vous pouvez raccourcir vos expressions XPath, en fonction de ce que vous voulez faire. Par exemple, la requête précédente aurait pu s’écrire : « blog//billet » ou encore « //billet ». Le « x//y » spécifie que vous sélectionnez tous les nœuds « y » pouvant être quelque part dans l’ensemble de la descendance du nœud « x ».

Maintenant qu’on a vu globalement le principe, on peut voir ce qui fait vraiment l’efficacité du XPath : les Prédicats.

Les Prédicats XPath

Vous pouvez préciser vos chemins XPath en conditionnant à l’aide de Prédicats Xpath. Par exemple, si vous voulez spécifier le chemin XPath qui sélectionne uniquement les billets dont la catégorie est « XML », voici comment s’intègre le prédicat : « /blog/billets/billet\[categorie=’XML’] » Si vous voulez sélectionner les titres de ces billets, tout simplement : « /blog/billets/billet\[categorie=’XML’]/titre ». Autre exemple, si vous voulez tous les titres du document XML pourvu d’un attribut « langue » : « //titre\[@langue] ».
La syntaxe est donc simplement : « x\[prédicat sur les descendants de X ou sur ses attributs]/suite/du/path ».

Les opérateurs supportés par les prédicats

Les différents opérateurs supportés au sein des prédicats (et dans XPath en général) sont par exemple =, <=, >=, <, >, +, -, *, div(pour la division).
Les opérateurs logiques « and » et « or » pour combiner plusieurs conditions. Il existe également des fonctions qui peuvent s’avérer bien utiles.

Quelques fonctions XPath

On va découvrir quelques unes des fonctions XPath phares sur des exemples :

  • « //billet\[string-length(titre)>=10] » : sélectionne tous les billets dont la longueur du titre vaut plus de 10 caractères. Fonction utilisée : string-length
  • « //billet\[contains(titre,’xml’)] » : sélectionne tous les billets dont le titre contient la chaîne de caractère « xml ». Fonction utilisée : contains
  • « //billet\[starts-with(categorie,’Découvrir’)] » : sélectionne tous les billets dont la catégorie commence par la chaine « Découvrir ». Fonction utilisée : starts-with
  • « //billet\[position() = last()] » : sélectionne le dernier élément de la liste des billets. Fonctions utilisées : position() qui retourne le rang du nœud courant dans son nœud parent ; last() qui renvoie le dernier rang des fils du parent du noeud courant (ou des frères du noeud courant si vous préférez).
  • « //billet\[(last() – 2) <= position()) and (position() <= last())]" : sélectionne les deux derniers billets de la liste des billets.

Il existe bien d’autres fonctions plus ou moins utilisées. Je vous redirige vers la documentation officielle de XPath si vous désirez plus de détail sur la question.

Pour conclure

Comme vous l’avez vu la syntaxe XPath est très simple d’utilisation, et peut permettre de faire des sélections précises dans votre document XML. Oui mais voilà, XPath tout seul, ca ne sert pas à grand chose :p Nous verrons comment le mettre en pratique par l’intermédiaire d’un langage XML qui a déjà fait son nom depuis longtemps : XSLT
Vous aurez alors un aperçu de toute la puissance de XPath en pratique.

À propos de JB

JB est ingénieur en informatique, et oui, de temps à autre, il lui est arrivé de tapoter sur "30 minutes par jour" !

Une réponse à La Syntaxe XPath

  1. BN

    Génial comme billet JB ! Merci bien ! (décidément, je n’arrive pas à afficher le nom de l’auteur d’un billet. J’ai du supprimer ça quand j’ai configuré le blog…)
    Je ne pensais pas que XPath était aussi puissant. Y doit y avoir moyen de faire vachement de choses avec tout ça.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*