Bases de données documentaires et distribuées Cours NFE04 Le langage XPath: les axes Auteurs : Raphaël Fournier-S niehotta, Philippe Rigaux prénom.nom@cnam.fr Département d informatique Conservatoire National des Arts & Métiers, Paris, France
Plan du cours
Les axes dans XPath (déf. W3C) Axis name child attribute ancestor ancestor-or-self descendant descendant-or-self following following-sibling namespace parent preceding preceding-sibling self Semantics Selects all children of the current node (défaut) Selects all attributes of the current node Selects all ancestors of the current node Selects all ancestors of the current node and the current node itself Selects all descendants of the current node Selects all descendants of the current node and the current node itself Selects everything in the document defined after the closing tag of the current node Selects all siblings after the current node Selects all namespace nodes of the current node Selects the parent of the current node Selects everything in the document that is defined before the start tag of the current node Selects all siblings before the current node Selects the current node
Illustration : un document XML 1 <?xml version="1.0" encoding="iso 8859 1"?> 2 <library> 3 < year="2010"> 4 <>Web Data and Distribution</> 5 <>S. Abiteboul</> 6 <>I. Manolescu</> 7 <> Rigaux</> 8 <>M. C. Rousset</> 9 <> Senellart</> 10 11 < year="2007"> 12 <>Database Systems</> 13 <>R. Ramakrishnan</> 14 <>J. Gehrke</> 15 16 </library> Listing 1 Fichier twos.xml Test Quelle est la forme arborescente (DOM) de ce document?
Quelques axes en exemple Prenons l exemple de l arbre DOM suivant : library "2010" "2007" Web Data and Distribution S. Abiteboul I. Manolescu Rigaux M.-C. Rousset Senellart Database Systems R. Ramakrishnan J. Gehrke
Child Quelques axes en exemple : child child : tous les enfants du nœud courant. child est l axe par défaut, on peut l omettre dans les expressions. library "2010" "2007" Web Data and Distribution S. Abiteboul I. Manolescu Rigaux M.-C. Rousset Senellart Database Systems R. Ramakrishnan J. Gehrke
Child Quelques axes en exemple : child child : tous les enfants du nœud courant. library "2010" "2007" Web Data and Distribution S. Abiteboul I. Manolescu Rigaux M.-C. Rousset Senellart Database Systems R. Ramakrishnan J. Gehrke
Child Quelques axes en exemple : child child : tous les enfants du nœud courant. library "2010" "2007" Web Data and Distribution S. Abiteboul I. Manolescu Rigaux M.-C. Rousset Senellart Database Systems R. Ramakrishnan J. Gehrke
Child Quelques axes en exemple : child child : tous les enfants du nœud courant. library "2010" "2007" Web Data and Distribution S. Abiteboul I. Manolescu Rigaux M.-C. Rousset Senellart Database Systems R. Ramakrishnan J. Gehrke
Attribute Quelques axes en exemple : attribute attribute : sélectionne les attributs du nœud courant. attribute peut s abréger en "@". Un attribut n est pas un enfant de son nœud élément. library "2010" "2007" Web Data and Distribution S. Abiteboul I. Manolescu Rigaux M.-C. Rousset Senellart Database Systems R. Ramakrishnan J. Gehrke
Attribute Quelques axes en exemple : attribute attribute : sélectionne les attributs du nœud courant. library "2010" "2007" Web Data and Distribution S. Abiteboul I. Manolescu Rigaux M.-C. Rousset Senellart Database Systems R. Ramakrishnan J. Gehrke
Attribute Exemple /child::library/child::*/@year S abrège en : /library/*/@year Root <!- ceci > <library> </library> "1857" "1862" "1877" <> </> <> </> <> <> ln = "Besancon" </> </> ln = "Paris" <> </> <> </> Charles Baudelaire Les fleurs du mal Victor Hugo Les miserables Emile Zola L assomoir
Attribute Exemple (suite) /library/*/@year Root <!- ceci > <library> </library> "1857" "1862" "1877" <> </> <> </> <> <> ln = "Besancon" </> </> ln = "Paris" <> </> <> </> Charles Baudelaire Les fleurs du mal Victor Hugo Les miserables Emile Zola L assomoir
Attribute Exemple (suite) /library/*/@year Root <!- ceci > <library> </library> "1857" "1862" "1877" <> </> <> </> <> <> ln = "Besancon" </> </> ln = "Paris" <> </> <> </> Charles Baudelaire Les fleurs du mal Victor Hugo Les miserables Emile Zola L assomoir
Attribute Exemple (suite) /library/*/@year Root <!- ceci > <library> </library> "1857" "1862" "1877" <> </> <> </> <> <> ln = "Besancon" </> </> ln = "Paris" <> </> <> </> Charles Baudelaire Les fleurs du mal Victor Hugo Les miserables Emile Zola L assomoir
Attribute Exemple (suite) /library/*/@year Root <!- ceci > <library> </library> "1857" "1862" "1877" <> </> <> </> <> <> ln = "Besancon" </> </> ln = "Paris" <> </> <> </> Charles Baudelaire Les fleurs du mal Victor Hugo Les miserables Emile Zola L assomoir
Tests et prédicats Plan du cours
Tests et prédicats Test de nœud Les tests de nœuds Test du type du nœud : node() sélectionne les nœuds quelque soit leur type (élément, nœud texte, processing-instruction) text() sélectionne les nœuds de type texte comment() sélectionne les nœuds de type commentaire processing-instruction() sélectionne les nœuds de type proc-instruction Test de nom : name sélectionne les éléments ou attributs de noms name * sélectionne les nœuds nommés (Element ou Attribute), quel que soit le nom.
Tests et prédicats Test de nœud Expressions complètes avec child Revenons sur child. child::para sélectionne l élément de nom para, enfant du nœud courant. child::* sélectionne tous les Elements enfants du nœud courant (pas les nœuds Text). child::text() sélectionne tous les nœuds Text enfants du nœud courant. child::node() sélectionne tous les Elements enfants du nœud courant, quel que soit leur type.
Tests et prédicats Test de nœud Mise en jambe Test Que cherchent à calculer les expressions suivantes? Donner les résultats de leurs évaluations sur le fichier twos.xml. /child::library /child::*/child::/child::/child::text() /child::library/child::/attribute::* /child::library/child::/attribute::year /descendant:: /child::*/descendant::library /descendant::/child::
Tests et prédicats Les prédicats Les prédicats Un prédicat est une condition filtrant un ensemble contexte (ne garde que les nœuds (sous-arbres) satisfaisant la condition). Contraintes booléennes (combinaison logique (and, or, not) de contraintes plus simples) : Comparaisons child::biblio/child::livre[attribute::isbn= 0262-01210-3 ]/child::s Existence d un attribut ou d un élément document[child::date] personne[attribute::date_naissance] Exemples (W3C) : child::employee[child::secretary or child::assistant] descendant::toy[not(attribute::color = "red") and attribute::country= "China"]
Tests et prédicats Les prédicats Evaluation des prédicats Une petite subtilité Si l expression est une véritable expression booléenne, pas de soucis /inventory/drink/lemonade[child::amount>15] Si le résultat du prédicat ou si le prédicat est un nombre, le résultat du prédicat est converti à true si le nombre est égal à la position dans le contexte d évaluation (sinon false) Ainsi, para[3] est équivalent à para[position()=3].
Tests et prédicats Les prédicats Zoom sur les prédicats utilisant la fonction position() <library> < year="2010"> <>Web Data and Distribution</> <>S. Abiteboul</> <>I. Manolescu</> <> Rigaux</> <>M. C. Rousset</> <> Senellart</> < year="2007"> <>Database Systems</> <>R. Ramakrishnan</> <>J. Gehrke</> </library> Listing 2 Extrait de twos.xml Example /child::library/child::/child::[position()=1] Test Quel est le résultat de l évaluation de cette requête appliquée au document twos.xml?
Tests et prédicats Les prédicats Zoom sur les prédicats utilisant la fonction position() <library> < year="2010"> <>Web Data and Distribution</> <>S. Abiteboul</> <>I. Manolescu</> <> Rigaux</> <>M. C. Rousset</> <> Senellart</> < year="2007"> <>Database Systems</> <>R. Ramakrishnan</> <>J. Gehrke</> </library> Listing 3 Extrait de twos.xml Example /child::library/child::/child::[position()=last()] Test Quel est le résultat de l évaluation de cette requête appliquée au document twos.xml?
Tests et prédicats Les prédicats Zoom sur les prédicats utilisant la fonction position() <library> < year="2010"> <>Web Data and Distribution</> <>S. Abiteboul</> <>I. Manolescu</> <> Rigaux</> <>M. C. Rousset</> <> Senellart</> < year="2007"> <>Database Systems</> <>R. Ramakrishnan</> <>J. Gehrke</> </library> Listing 4 Extrait de twos.xml Example /child::library/child::/child::[position()=3] Test Quel est le résultat de l évaluation de cette requête appliquée au document twos.xml?
Tests et prédicats Les prédicats Zoom sur les prédicats utilisant la fonction position() <library> < year="2010"> <>Web Data and Distribution</> <>S. Abiteboul</> <>I. Manolescu</> <> Rigaux</> <>M. C. Rousset</> <> Senellart</> < year="2007"> <>Database Systems</> <>R. Ramakrishnan</> <>J. Gehrke</> </library> Listing 5 Extrait de twos.xml Example /child::library/child::[position()=2]/child:: Test Quel est le résultat de l évaluation de cette requête appliquée au document twos.xml?
Tests et prédicats Les prédicats Zoom sur les prédicats utilisant la fonction position() <library> < year="2010"> <>Web Data and Distribution</> <>S. Abiteboul</> <>I. Manolescu</> <> Rigaux</> <>M. C. Rousset</> <> Senellart</> < year="2007"> <>Database Systems</> <>R. Ramakrishnan</> <>J. Gehrke</> </library> Listing 6 Extrait de twos.xml Example /child::library/child::/child::*[position()=1] Test Quel est le résultat de l évaluation de cette requête appliquée au document twos.xml?