Copyright © 2023 Yves MARCOUX; dernière modification de cette page: 2023-03-06.

INU3011 Documents structurés

Exercices XPath

Yves MARCOUXEBSIUniversité de Montréal


Préalable : Cours 8.

N.B. : Les exercices marqués d’un obèle † sont facultatifs (ils dépassent les objectifs du cours).


Table des matières

Compréhension d’expressions XPath

Rédaction d’expressions XPath


Compréhension d’expressions XPath

Décrivez en vos mots ce qui est retourné par chacune des expressions XPath suivantes.

Validez votre compréhension en exécutant l’expression dans oXygen sur le document 200-Ex-XPath/doc-realiste.xml.

  1. //*
    - Réponse
    Tous les éléments du document (c’est-à-dire, tous les nœuds qui sont des éléments), incluant l’EPHN.
  2. //@*
    - Réponse
    Toutes les spécifications d’attribut du document.
  3. //@courriel
    - Réponse
    Toutes les spécifications d’attribut dans lesquelles le nom d’attribut est "courriel".
  4. //emph
    - Réponse
    Tous les éléments nommés (c.-à-d. dont l’identificateur générique est) "emph".
  5. //emph/emph
    - Réponse
    Tous les éléments nommés "emph" qui sont enfants directs d’un autre élément "emph".
  6. //destinataires/nom
    - Réponse
    Tous les éléments "nom" qui sont enfants directs d’un élément "destinataires".
  7. //corps/*
    - Réponse
    Tous les éléments (peu importe leur identificateur générique) qui sont enfants directs d’un élément "corps".
  8. //corps//*
    - Réponse
    Tous les éléments qui sont descendants (pas nécessairement directs) d’un élément "corps".
  9. //*[nom]
    - Réponse
    Tous les éléments qui sont parents directs d’un élément "nom".
  10. //*[emph]
    - Réponse
    Tous les éléments qui sont parents directs d’un élément "emph".
  11. //*[1]
    - Réponse
    Tous les éléments qui sont premiers de fratrie.
  12. //*[last()]
    - Réponse
    Tous les éléments qui sont derniers de fratrie.
  13. /*
    - Réponse
    L’élément de plus haut niveau du document (l’élément-document).
  14. /*/*
    - Réponse
    Tous les éléments qui sont au premier niveau hiérarchique sous l’élément de plus haut niveau.
  15. /*/*/*
    - Réponse
    Tous les éléments qui sont au deuxième niveau hiérarchique sous l’élément de plus haut niveau.
  16. † /
    - Réponse
    Le nœud-racine du modèle XPath du document. Le nœud-racine est celui « ajouté » au-dessus de l’EPHN. Comme ce nœud est au-dessus de ce qu’oXygen peut montrer dans l’onglet du document, il est identifié dans la liste de résultats par la mention #document, sous Description, et si on clique sur ce résultat, il n’y a aucun déplacement du curseur dans l’onglet du document.
  17. † //*[*/nom]
    - Réponse
    Tous les éléments qui sont « grand-parents » d’un élément nom (dans le document exemple, il n’y a que mémo qui réponde à ce critère).
  18. † //*[*[nom]]
    - Réponse
    Équivalent à l’exemple précédent.
  19. † //*[not(*)]
    - Réponse
    Éléments qui n’ont pas de sous-élément.
  20. //lisibilité[.='2']
    - Réponse
    Tous les éléments "lisibilité" dont le contenu textuel est "2".
  21. //urgence[.='2']
    - Réponse
    Tous les éléments "urgence" dont le contenu textuel est "2". Illustre que ce n’est pas une erreur si une expression XPath ne retourne aucun nœud.
  22. //*[.='2']
    - Réponse
    Tous les éléments dont le contenu textuel est "2".
  23. //*[.='septembre']
    - Réponse
    Tous les éléments dont le contenu textuel est "septembre".
  24. //*[.='']
    - Réponse
    Tous les éléments dont le contenu textuel est vide.
  25. † //*[.='' and not(*)]
    - Réponse
    Tous les éléments dont le contenu textuel est vide et qui n’ont aucun sous-élément.
  26. //@*[.='signature']
    - Réponse
    Toutes les spécifications d’attribut dont la valeur d’attribut est "signature".
  27. //*[@rôle='signature']
    - Réponse
    Tous les éléments comportant un attribut "rôle" dont la valeur est "signature".
  28. //*[not(@courriel='jr@jr.org')]
    - Réponse
    Tous les éléments ne comportant PAS un attribut "courriel" dont la valeur est "jr@jr.org". Retourne entre autres tous les éléments qui n’ont simplement pas d’attribut courriel.
  29. //*[@courriel!='jr@jr.org']
    - Réponse
    Tous les éléments comportant un attribut "courriel" dont la valeur n'est PAS "jr@jr.org".
  30. † //*[@courriel[.!='jr@jr.org']]
    - Réponse
    Équivalent au numéro précédent.
  31. //*[contains(.,'ro')]
    - Réponse
    Tous les éléments dont le contenu textuel contient quelque part la chaîne "ro". Rappelons-nous que le contenu textuel d’un élément fait aussi partie du contenu textuel de tous ses ancêtres.
  32. //*[contains(.,'ro') or contains(.,'Ro')]
    - Réponse
    Tous les éléments dont le contenu textuel contient quelque part une des chaînes "ro" ou "Ro". Le résultat est différent du numéro précédent, car la casse est significative.
  33. //text()
    - Réponse
    Tous les nœuds textuels.
  34. //text()[contains(.,'tr')]
    - Réponse
    Tous les nœuds textuels contenant quelque part la chaîne "tr".
  35. //text()[contains(.,'ie')]
    - Réponse
    Tous les nœuds textuels contenant quelque part la chaîne "ie".
  36. //*[count(nom) > 2]
    - Réponse
    Éléments qui ont au moins trois sous-éléments nom.
  37. //*[count(nom) != 2]
    - Réponse
    Éléments qui n’ont pas exactement deux sous-élément nom. Rappel : "!=" signifie "est différent de".
  38. //*[count(nom[@courriel]) >= 2]
    - Réponse
    Éléments qui ont au moins deux sous-éléments nom avec un attribut courriel. ">=" signifie "plus grand ou égal à".
  39. //*[1]
    - Réponse
    Tous les éléments qui sont premiers de fratrie.
  40. //*[last()]
    - Réponse
    Tous les éléments qui sont derniers de fratrie.
  41. //*[position() != last()]
    - Réponse
    Tous les éléments sauf les derniers de fratrie.
  42. //*[name()='nom']
    - Réponse
    Tous les éléments dont le nom d’élément est "nom" (équivalent à //nom).
  43. //*[name()!='nom']
    - Réponse
    Tous les éléments dont le nom d’élément n’est pas "nom".
  44. //*[name()='normal' or name()='nom']
    - Réponse
    Tous les éléments dont le nom d’élément est soit "nom", soit "normal".
  45. † //comment()
    - Réponse
    Tous les nœuds commentaires.
  46. † //*[not(name()='cc')]/comment()
    - Réponse
    Tous les nœuds commentaires qui ne sont pas enfants d’un élément cc.
  47. count( //text() )
    - Réponse
    Nombre de nœuds textuels dans le document.
  48. count( //text()[contains(.,'tr')] )
    - Réponse
    Nombre de nœuds textuels qui contiennent la chaîne "tr" dans le document.
  49. count(//*)
    - Réponse
    Nombre d’éléments dans le document.
  50. count(//@*)
    - Réponse
    Nombre de spécifications d’attribut dans le document.
  51. † count(//comment())
    - Réponse
    Nombre de commentaires dans le document.

Rédaction d’expressions XPath

Rédigez une expression XPath pour chacune des tâches suivantes. Vérifiez le fonctionnement de votre solution en l’exécutant dans oXygen.

  1. Extraire le dernier paragraphe (élément par) qui est enfant direct de corps.
    - Réponse
    //corps/par[last()]
  2. Extraire tous les éléments qui contiennent directement un sous-élément normal.
    - Réponse
    //*[normal]
  3. Extraire tous les éléments qui contiennent directement ou indirectement un sous-élément emph.
    - Réponse
    //*[.//emph]
  4. Extraire tous les éléments emph qui contiennent directement un sous-élément emph.
    - Réponse
    //emph[emph]
  5. Extraire tous les éléments emph qui sont enfants directs d’un élément emph.
    - Réponse
    //emph/emph
  6. † Extraire tous les éléments dont une valeur d’attribut contient la chaîne "si".
    - Réponse
    //*[@*[contains(., 'si')]]
  7. Extraire tous les éléments qui sont enfants immédiats d’un paragraphe (par).
    - Réponse
    //par/*
  8. † Extraire tous les éléments dont une valeur d’attribut contient la chaîne "gn".
    - Réponse
    //*[@*[contains(., 'gn')]]