Nous avons expliqué comment écrire un document xml bien formé, comment vérifier si ce document est valide ou non , soit selon des règles écrites dans un document DTD ou dans un schéma xml.

Cette partie de cours met l’accent sur le langage de requête XPATH : le rôle d’une expression xpath , comment lire et écrire une expression xpath.

XPATH : XML Path Language

Le langage de requête XPath (XML Path Language) peut être utilisé pour parcourir les éléments et les attributs d’un document XML. Ainsi, Une expression XPath (non xml) est une requête qui sert principalement à extraire telle ou telle partie de l’arborescence XML. 

expression xpath

XPath contient plus de 200 fonctions intégrées. Aujourd’hui, les expressions XPath peuvent également être utilisées en JavaScript, Java, schéma XML, PHP, Python, C et C ++, et de nombreux autres langages. Aussi, XPath est un élément majeur de la norme XSLT

Remarque :

  • XPath 1.0 est devenu une recommandation W3C le 16 novembre 1999. 
  • la version XPath 2.0 est devenu une recommandation du W3C le 23 janvier 2007.
  • Le 8 avril 2014 , XPath 3.0 est devenu une recommandation W3C

 XPath utilise des expressions de chemin pour sélectionner des nœuds ou des ensembles de nœuds dans un document XML. Ces expressions de chemin ressemblent beaucoup aux expressions de chemin que vous utilisez avec les systèmes de fichiers informatiques traditionnels: 

xpath : chemin relatif ou absolu

Remarque : 

– chemin absolu : /étape1/étape2/étape3/…    

– chemin relatif : étape1/étape2/étape3/…   

Terminologies xpath

a- Noeuds

Les documents XML sont traités comme des arbres de nœuds. Ainsi, l’élément le plus haut de l’arbre est appelé l’élément racine. Dans XPath, il existe sept types de nœuds: nœuds élément, attribut, texte, espace de noms, instruction de traitement, commentaire et document.

noeuds xpath

b- les relations entre les nœuds

  • Parent : Chaque élément et attribut a un parent.
  • Children : Les nœuds d’élément peuvent avoir zéro, un ou plusieurs enfants.
  •  Siblings : Noeuds ayant le même parent.
  • Ancestors (ancêtres) : Parent d’un nœud, parent d’un parent, etc.
  • Descendants (descendance) : Les enfants d’un nœud, les enfants des enfants, etc.

Syntaxe xpath

XPath utilise des expressions de chemin pour sélectionner des nœuds ou des ensembles de nœuds dans un document XML. Donc, le nœud est sélectionné en suivant un chemin ou des étapes. 

a- Sélection des nœuds :

 Le nœud est sélectionné en suivant un chemin ou des étapes. Pour cela, on peut utiliser les expressions  de chemin les plus utiles qui sont : 

expression de chemin xpath

Exemple :

xml :

<?xml version="1.0" encoding="UTF8"?>
<stagiaires>
 <stagiaire numI="1509">
<note module="108">15.25</note>
<nom>ELAMARI</nom>
<prenom> aya</prenom>
 </stagiaire>
 <stagiaire numI="1809">
<note module="108">17.25</note>
<nom>khedami</nom>
<prenom> ibrahim </prenom>
 </stagiaire>
 </stagiaires>
  • L’expression xpath : /stagiaires/stagiaire permet de sélectionner tous les éléments ‘stagiaire’ qui  sont des enfants de ‘stagiaires’ 
  • Cette expression : //stagiaire Sélectionne tous les éléments  ‘stagiaire’ peu importent  où ils se trouvent dans le document
  • Alors que l’expression : //@moduleSélectionne tous les attributs nommés module 

b- Prédicats

Les prédicats sont utilisés pour rechercher un nœud spécifique ou un nœud contenant une valeur spécifique (exprimer une condition). Aussi, les prédicats sont toujours intégrés entre crochets. 

Exemples : 

  1. L’expression xpath /stagiaires/stagiaire[1] Sélectionne le premier élément stagiaire qui est l’enfant de  l’élément de stagiaires.
  2. /stagiaires/stagiaire[last()] :  Sélectionne le dernier élément stagiaire qui est l’enfant de l’élément stagiaires
  3. /stagiaires/stagiaire[last()-1] : Sélectionne l’avant dernier élément stagiaire qui est l’enfant de l’élément de stagiaires.
  4. /stagiaires/stagiaire[position()<5] Sélectionne les quatre premiers éléments stagiaire qui est l’enfant de l’élément de stagiaires.
  5.  
  6. //stagiaire[@numI]Sélectionne tous les éléments ‘stagiaire’ qui ont un attribut  nommé numI
  7. //stagiaire[@numI=’1509’] Sélectionne tous les éléments ‘stagiaire’ qui ont un attribut  numI avec la valeur 1509
  8. //stagiaire[note>10] Sélectionne tous les éléments ‘stagiaire’ qui ont un élément de  note avec une valeur supérieure à 10.
  9. //stagiaire[note>10]/nom Sélectionne tous les éléments ‘nom’ des éléments ‘stagiaire’  qui ont un élément de note avec une valeur supérieure à 10.

c- Sélection de nœuds inconnus

Les caractères génériques XPath peuvent être utilisés pour sélectionner des nœuds XML inconnus. Voilà la description de chacun des caractères génériques :

  1. *Correspond à n’importe quel nœud d’élément 
  2.  @*Correspond à n’importe quel nœud d’attribut
  3. node ()Correspond à n’importe quel nœud de toute sorte 

Exemple :

  •  //* : selectionner tous les éléments du document
  •  //stagiaire[@*] : Sélectionne tous les éléments ‘stagiaire’ qui ont au moins un attribut de toute nature

d- Sélection de plusieurs chemins 

En utilisant le | Dans une expression XPath, vous pouvez sélectionner plusieurs chemins.

Exemples : 

– //note | //nom : sélectionner tous les éléments ‘note’ et ‘nom’ dans le document.

Remarque : Les opérateurs XPath

Une expression XPath renvoie soit un ensemble de nœuds, une chaîne, un booléen ou un nombre. Voici une liste des opérateurs qui peuvent être utilisés dans les expressions XPath: | , +, – , *, div, =, !=, < , <=, >, >=, or, and, mod 

Exemples : 

/AAASélectionne l’élément racine AAA

    
<AAA> 
<BBB/> 
<CCC/> 
<BBB/> 
<DDD> <BBB/> </DDD> <CCC/>
</AAA>

AAA/CCC  : Sélectionne tous les éléments CCC qui sont enfants de l’élément racine AAA 

<AAA> 
          <BBB/> 
          <CCC/> 
          <BBB/> 
          <DDD> 
               <BBB/> 
          </DDD> 
          <CCC/> 
     </AAA> 

AAA/DDD/BBB  Sélectionne tous les éléments BBB qui sont enfants de DDD, qui sont enfants de l’élément racine AAA 

 

Résultats :

  <AAA> 
          <BBB/> 
          <CCC/> 
          <BBB/> 
          <DDD> 
               <BBB/> 
          </DDD> 
          <CCC/> 
     </AAA> 

/AAA/BBB[1]Sélectionne le premier élément BBB, fils de l’élément racine AAA 

Résultats :

  <AAA> 
          <BBB/>  
          <BBB/> 
          <BBB/> 
     </AAA>

AAA/BBB[last()] : Sélectionne le dernier élément BBB,

fils de l’élément racine AAA 

Résultats :
  <AAA>
          <BBB/>  
          <BBB/> 
          <BBB/> 
     </AAA>

//@id : Sélectionne tous les attributs id  

Résultats :

  <AAA> 
  <BBB id = "b1"/> 
  <BBB id = "b2"/>  
   <BBB name = "bbb"/> 
    <BBB/> 
</AAA>

//BBB[@id]  : Sélectionne tous BBB qui ont un attribut id 

Résultats :

  <AAA> 
   <BBB id = "b1"/> 
   <BBB id = "b2"/>  
   <BBB name = "bbb"/> 
    <BBB/> 
     </AAA>

//BBB[@*] : Sélectionne tous BBB qui ont un attribut 

Résultats :

  <AAA> 
    <BBB id = "b1"/> 
    <BBB id = "b2"/> 
    <BBB name = "bbb"/> 
    <BBB/> 
</AAA>

//BBB[@name] : Sélectionne tous BBB qui ont un attribut name 

Résultats :

  <AAA> 
   <BBB id = "b1"/> 
   <BBB id = "b2"/> 
   <BBB name = "bbb"/> 
   <BBB/> 
 </AAA>

//BBB[not(@*)] : Sélectionne tous BBB qui n’ont pas d’attribut

Résultats :

  <AAA> 
    <BBB id = "b1"/> 
    <BBB id = "b2"/> 
    <BBB name = "bbb"/> 
    <BBB/> 
</AAA>

//BBB[normalizespace(@name)=’bbb’] : Sélectionne tous les éléments BBB ayant un attribut name dont la valeur est bbb. Les espaces de début de de fin sont supprimés avant la comparaison 

Résultats :

  <AAA> 
   <BBB id = "b1"/>  
   <BBB name = " bbb "/> 
   <BBB name = "bbb"/> 
</AAA>

//BBB[@id=’b1′] : Sélectionne tous les éléments BBB ayant un attribut id dont la valeur est b1 

Résultats :

 <AAA> 
  <BBB id = "b1"/>  
  <BBB name = " bbb "/> 
  <BBB name = "bbb"/> 
 </AAA>

//*[count(BBB)=2] : Sélectionne les éléments ayant deux  enfants BBB

Résultats :

 <AAA>  
          <CCC> 
               <BBB/>
               <BBB/>       
<BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>

//*[count(*)=3] : Sélectionne les éléments ayant trois enfants 

Résultats :

 <AAA> 
          <CCC>  
               <BBB/> 
               <BBB/> 
               <BBB/> 
          </CCC> 
          <DDD> 
               <BBB/> 
               <BBB/> 
          </DDD> 
          <EEE> 
               <CCC/> 
               <DDD/> 
          </EEE> 
     </AAA>

//*[contains(name(),’C’ )] 

Résultats :

    <AAA> 
          <BCC>  
               <BBB/>
<BBB/>  <BBB/> 
          </BCC> 
          <DDB> 
               <BBB/> <BBB/> 
          </DDB> 
          <BEC> 
               <CCC/> 
               <DBD/> 
          </BEC> 
     </AAA> 

//FFF/ancestor::*  Séléctionne tous les ancêtres de

l’élément FFF 

Résultats :

    <AAA> 
          <BBB> 
               <DDD> 
                    <CCC> 
                         <DDD/> 
                         <EEE/> 
                    </CCC> 
               </DDD> 
          </BBB> 
          <CCC> 
               <DDD> 
                    <EEE> 
                         <DDD> 
                              <FFF/> 
                         </DDD> 
                    </EEE> 
               </DDD> 
          </CCC> 
     </AAA>

Remarque :  

  • count() est une fonction  qui compte le nombre d’éléments sélectionnés.  
  • name() : fonction qui retourne le nom de l’élément, 
  • La fonction start-with retourne vrai si la chaîne du premier argument commence par celle du deuxième 
  • contains est une fonction  qui retourne vrai si la chaîne du premier argument contient celle du deuxième  
  • La fonction string-length retourne le nombre de caractères dans une chaîne. Vous devez utiliser &lt; comme substitutif de < et &gt comme substitutif de >  
  •  L’axe “parent” contient le parent du noeud contextuel s’il en a un  
  • L’axe ancêtre (ancestor) contient les ancêtres du noeud contextuel; cela comprend son parent et les parents des parents etc… Aussi, cet axe contient toujours le noeud racine, sauf si le noeud contextuel est lui-même la racine.  

Nous vous proposons de voir la vidéo suivante (En darija Marocaine) qui résume et explique cette partie de cours :

Vous pouvez suivre notre cours complet d’XML . pour approfondir vos compétences sur la création et la manipulation des documents xml, dtd, xsd,xpath, xslt.

Aussi, vous avez une playlist des vidéos (Explication en Darija arabe marocaine)  bien organisée qui traite : XML DTD XSD XSLT XPATH

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *