XPath intensif

Utilisation des axes

Les axes disponibles en XPath

Il existe beaucoup d'axes disponibles. Une liste complète se trouve à cette adresse

Voici les plus courants :

ExempleCode d'exemple

Voici un XML d'exemple sur lequel les exemples XPath sont basés

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
2
<biblio>
3
  <livre>
4
    <!-- classique -->
5
    <titre lang="fr">Harry Potter</titre>
6
    <prix>29.99</prix>
7
  </livre>
8
  <livre>
9
    <titre lang="fr">Apprendre XML</titre>
10
    <prix>39.95</prix>
11
    <!-- pas donné! -->
12
  </livre>
13
</biblio> 
<?xml version="1.0" encoding="UTF-8"?>
<biblio>
  <livre>
    <!-- classique -->
    <titre lang="fr">Harry Potter</titre>
    <prix>29.99</prix>
  </livre>
  <livre>
    <titre lang="fr">Apprendre XML</titre>
    <prix>39.95</prix>
    <!-- pas donné! -->
  </livre>
</biblio> 

child

Définitionchild - l'axe par défaut

Vous l'utilisez à chaque fois que vous ne spécifiez pas d'axe. Ce dernier renvoi tout les éléments enfants de l'élément courant

Exemple

CTRL+C pour copier, CTRL+V pour coller
1
/child::biblio/child::livre/child::titre/child::text()
2
ou bien (plus clair quand même):
3
/biblio/livre/titre/text()
/child::biblio/child::livre/child::titre/child::text()
ou bien (plus clair quand même):
/biblio/livre/titre/text()

Renvoi :

CTRL+C pour copier, CTRL+V pour coller
1
Harry Potter
2
Apprendre XML
Harry Potter
Apprendre XML

descendant

Définitiondescendant - l'axe du "//"

Descendant recherche, comme son nom l'indique, dans tout les descendants du nœud sélectionné.

Il est utile pour chercher un nœud profond par exemple.

C'est aussi l'axe utilisé quand vous utilisez la syntaxe "//qqchose" équivalente à /descendant::qqchose

Exemple

CTRL+C pour copier, CTRL+V pour coller
1
/descendant::livre/descendant::text()
2
ou bien :
3
//livre//text()
/descendant::livre/descendant::text()
ou bien :
//livre//text()

Renvoi :

CTRL+C pour copier, CTRL+V pour coller
1
\n\t\t
2
Harry Potter
3
\n\t\t
4
29.99
5
\n\t
6
\n\t\t
7
Apprendre XML
8
\n\t\t
9
39.95
10
\n\t\t
11
\n\t\t
12
\n\t
\n\t\t
Harry Potter
\n\t\t
29.99
\n\t
\n\t\t
Apprendre XML
\n\t\t
39.95
\n\t\t
\n\t\t
\n\t

descendant-or-self

Complémentdescendant-or-self

Il existe aussi un axe descendant-or-self. Mais à quoi peut-il bien servir ?

L'axe descendant-or-self permet de rechercher dans une structure récursive efficacement

Exemple

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
2
<tiroir>
3
    <gigogne nom="poupée vide et triste" />
4
    
5
    <gigogne nom="énorme poupée 1">
6
        <gigogne nom="grosse poupée 1">
7
            <gigogne nom="moyenne poupée 1">
8
                <gigogne nom="petite poupée 1"/>
9
            </gigogne>
10
        </gigogne>
11
    </gigogne>
12
    
13
    <gigogne nom="moyenne poupée 2">
14
        <gigogne nom="petite poupée 2"/>
15
    </gigogne>
16
    
17
</tiroir>
<?xml version="1.0" encoding="UTF-8"?>
<tiroir>
    <gigogne nom="poupée vide et triste" />
    
    <gigogne nom="énorme poupée 1">
        <gigogne nom="grosse poupée 1">
            <gigogne nom="moyenne poupée 1">
                <gigogne nom="petite poupée 1"/>
            </gigogne>
        </gigogne>
    </gigogne>
    
    <gigogne nom="moyenne poupée 2">
        <gigogne nom="petite poupée 2"/>
    </gigogne>
    
</tiroir>
CTRL+C pour copier, CTRL+V pour coller
1
/tiroir/gigogne[2]/descendant::gigogne/@nom
/tiroir/gigogne[2]/descendant::gigogne/@nom

Renvoi :

CTRL+C pour copier, CTRL+V pour coller
1
grosse poupée 1
2
moyenne poupée 1
3
petite poupée 1
grosse poupée 1
moyenne poupée 1
petite poupée 1

On voudrait cependant inclure l'énorme poupée aussi

En utilisant plutôt :

CTRL+C pour copier, CTRL+V pour coller
1
/tiroir/gigogne[2]/descendant-or-self::gigogne/attribute::nom
2
3
ou en abrégé :
4
/tiroir/gigogne[2]/descendant-or-self::gigogne/@nom
5
6
ou pour obtenir la même chose sans utiliser descendant-or-self mais 
7
en effectuant une double recherche de gigogne[2] dans l'arbre XML :
8
/tiroir/gigogne[2]//gigogne/@nom | /tiroir/gigogne[2]/@nom
/tiroir/gigogne[2]/descendant-or-self::gigogne/attribute::nom

ou en abrégé :
/tiroir/gigogne[2]/descendant-or-self::gigogne/@nom

ou pour obtenir la même chose sans utiliser descendant-or-self mais 
en effectuant une double recherche de gigogne[2] dans l'arbre XML :
/tiroir/gigogne[2]//gigogne/@nom | /tiroir/gigogne[2]/@nom

On obtient :

CTRL+C pour copier, CTRL+V pour coller
1
énorme poupée 1
2
grosse poupée 1
3
moyenne poupée 1
4
petite poupée 1
énorme poupée 1
grosse poupée 1
moyenne poupée 1
petite poupée 1

attribute

Définitionattribute - un axe de type

Attribute est l'axe qui permet de sélectionner, comme son nom l'indique, un attribut XML.

Attribute est l'axe utilisé avec la syntaxe "@"

Exemple

CTRL+C pour copier, CTRL+V pour coller
1
/biblio/livre/titre/attribute::lang
2
ou bien (plus clair quand même):
3
/biblio/livre/titre/@lang
/biblio/livre/titre/attribute::lang
ou bien (plus clair quand même):
/biblio/livre/titre/@lang

Renvoi :

CTRL+C pour copier, CTRL+V pour coller
1
fr
fr
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Version 2 Alexandre THOUVENIN, 2016. Version 1 de Jean-Baptiste Martin, 2015 (Contributions : Stéphane Crozat, les étudiants de NF29) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)