# Programmation XML/XPath

* Introduction
* Structure d'un document XML
* Espace de nom
* Définition de Type Document
* Interprétation du XML
** SAX
** DOM
* XPath
Applications fondamentales
* XSLT
* XML Schema
* XLink
* XPointer
* XForms
* XQuery
Applications finales
* WML
* XSL-FO
* SOAP
* XML Signature
* SMIL
* SVG
* MusicXML
* SyncML
* MathML
* VoiceXML
* X3D
* XMI
* XUL
* Introduction
* Structure d'un document XML
* Espace de nom
* Définition de Type Document
* Interprétation du XML
** SAX
** DOM
* XPath
Applications fondamentales
* XSLT
* XML Schema
* XLink
* XPointer
* XForms
* XQuery
Applications finales
* WML
* XSL-FO
* SOAP
* XML Signature
* SMIL
* SVG
* MusicXML
* SyncML
* MathML
* VoiceXML
* X3D
* XMI
* XUL
[ Modifier le sommaire ]

## Syntaxe

Le XPath est un langage de sélection de différents types d'objets XML, appelés « nœuds ». Un ensemble de nœuds est appelé « contexte ».
Le XPath se présente sous la forme de chemins composés de :
| Sélecteur | Notes |
| nom du nœud | Sélectionne ce qui est compris dans le nœud nommé. |
| / | Sélectionne en partant du nœud racine (chemin absolu). |
| // | Sélectionne en partant du nœud courant, peu importe le reste de l'emplacement. |
| . | Sélectionne à partir du nœud courant (chemin relatif). = self::node |
| .. | Sélectionne à partir du parent du nœud courant. = parent::node |
| @ | Sélectionne les attributs. = attribute:: |
| | | Opérateur de sélection multiple. |
Ces expressions sont appelées « chemin de localisation », composés d'un ou plusieurs « pas de localisation » (ou « étapes ») séparés par des « / ». Les pas de localisation ont chacun trois composants :
* Un axe (parent, descendant…).
* Un test de nœud (nom ou fonction désignant les nœuds).
* Des prédicats (entre crochets).

## Axes

Pour décrire les relations entre les nœuds, XPath utilise le vocabulaire suivant :
| Axe | Abréviation | Notes |
| ancestor | | ancêtre |
| ancestor-or-self | | ancêtre ou soi |
| attribute | @ | attribut, @abc signifie attribute::abc |
| child | | enfant, xyz signifie child::xyz |
| descendant | | |
| descendant-or-self | // | // signifie /descendant-or-self::node/ |
| following | | suivant |
| following-sibling | | frère suivant |
| namespace | | espace de noms |
| parent | .. | .. signifie parent::node |
| preceding | | précédent |
| preceding-sibling | | |
| self | . | soi, . signifie self::node |

## Tests de nœuds

Soit l'espace de nom ns :
* //ns:* sélectionne tous les éléments du namespace.
* //ns:nom récupère tous les éléments du namespace nommés "nom".
| Tests | Notes |
| comment | trouve tous les commentaires (ex : <!-- commentaire 1 -->) |
| text | trouve un nœud texte, (ex : hello world dans <k>hello<m> world</m></k>) |
| processing-instruction | trouve les instructions de traitement (ex : //processing-instruction('php') trouve <?php echo $a; ?>) |
| node | trouve tous les nœuds. |

## Prédicats

Les prédicats sont des fonctions filtrant les nœuds évalués à false, qui se placent à la fin des sélections :
Par exemple, les quatre requêtes ci-dessous renvoie le même résultat (si la branche 2 est la dernière comme dans l'exemple en bas de cette page) :
| Prédicats | Notes |
| last | renvoie le dernier nœud de la sélection |
| position | renvoie le nœud situé à la position précisée |
| count(contexte) | renvoie le nombre de nœuds en paramètre |
| starts-with(chaine1, sous-chaine2) | renvoie true si le premier argument commence avec le second |
| contains(botte_de_foin, aiguille) | renvoie true si le premier argument contient le second |
| sum(contexte) | renvoie la somme des valeurs numériques des nœuds en paramètre |
| floor(nombre) | renvoie le nombre arrondi à l'entier inférieur |
| ceiling(nombre) | renvoie le nombre arrondi à l'entier supérieur |
| round(nombre) | renvoie le nombre arrondi à l'entier le plus proche |

## Exemples

Soit l'arborescence suivante :

### Abréviations

* Sélection 1 : toutes les <feuille> d'une <brindille> contenue dans une <branche>, descendant du <tronc>, issu de la racine.
** Abrégé : /tronc/branche/brindille/feuille
** Non abrégé : /child::tronc/child::branche/child::brindille/child::feuille
* Sélection 2 : la <branche> dont l'attribut "nom" est "branche3", enfant du <tronc>, inclue dans la racine.
** Abrégé : /tronc/branche[@nom='branche3']
** Non abrégé : /child::tronc/child::branche[attribute::nom='branche3']
* Sélection 3 : toutes les brindilles ont au moins une feuille.
** //brindille[feuille]
* Sélection 4 : dernière branche du tronc.
** //tronc/branche[last]
* Sélection 5 : tous les noms des brindilles qui n'ont pas de feuille.
** //brindille[not(feuille)]/@nom

### PHP

Créer le .php suivant à côté du tronc.xml publié ci-dessus.

### eXist ou BaseX

    Pour plus de détails voir : XQuery.

## Références

* ↑ http://www.w3schools.com/dom/dom_nodetype.asp
* ↑ http://www.w3schools.com/xpath/xpath_syntax.asp
* ↑ http://www.w3.org/TR/xpath#corelib

## Voir aussi

* http://b3d.bdpedia.fr/query.html#s1-xpath-trouver-son-chemin-xml : explications avec vidéo en français