TP 2: XPath

Ce travail illustre le modèle XDM et l'utilisation de XPath pour le traitement de documents XML.

1. Modélisation XDM

Soit le document XML suivant :

<?xml version="1.0" encoding="utf-8"?>

<!-- A list of books -->
<BookList>
   <Books>
       <Item cat="S">
           <Title>Number, the Language of Science</Title>
           <Author>Danzig</Author>
           <Price>5.95</Price>
           <Quantity>3</Quantity>
           <Comment>Should be read</Comment>
       </Item>
   </Books>
   <Categories desc="Miscellaneous categories">
       A list of categories
       <Category code="S" desc="Science"/>
       <Category code="I" desc="Science" note="Limited Stock"/>
       <Category code="C" desc="Computing"/>
       <Category code="X" desc="Crime"/>
       <Category code="F" desc="Fiction"/>
   </Categories>
</BookList>
  1. Modéliser ce document sous forme d’arbre XDM.
  2. Annoter chaque nœud de l’arbre par sa position selon le parcours standard.

2. Environnement XPath dans Oxygen

Nous utiliserons comme pour le TP1 l’environnement d’édition XML Oxygen. Pour revoir la procédure d’installation du logiciel, se reporter a la section 1 du TP1.

La saisie de requêtes XPath se fait grâce au champ texte intitulé "XPath 2.0" situé au dessus à gauche de la fenêtre d’édition des documents XML. Ce champ n’est actif que si un document XML est ouvert dans la fenêtre d’édition.

Champ XPath d'Oxygen

Une fois la requête XPath entrée dans le champ dédié, celle ci peut être exécutée soit en appuyant sur la touche "Entrée", soit en cliquant sur le bouton "XPath".

Une fois la requête exécutée, la liste des fragments de documents sélectionnées est donnée dans l’onglet "XPath" au bas de l’interface.

Résultat XPath dans Oxygen

Lorsqu’un des éléments de la liste est cliqué, le fragment pointé est automatiquement sélectionné dans la fenêtre d’édition du document XML.

3. Premières requêtes XPath

Nous travaillerons pour l’instant avec le document books-extended.xml qui est une extension du fichier utilisé lors du TP1. Vous trouverez l’archive contenant le fichier nécessaire ici.

  • Évaluer l’expression //* pour le document books-extended.xml. Quel résultat est retourné ? Comment l’expliquez vous ?
  • Écrire une expression XPath qui permette de retourner le contenu du document books-exetended.xml.
  • Écrire une expression permettant de lister tous les attributs du document books.xml et seulement les attributs.

4. Des requêtes un peu plus fournies

Les prochaines requêtes utilisent la notion d’axes. Un axe étant un ensemble de nœuds relatifs au nœud courant dans le traitement de l’expression.

  1. En utilisant uniquement les axes child, descendant, et attribute, écrire des expressions retournant :
    • le document complet ;
    • les items ;
    • les livres ;
    • les items et les livres ;
    • les catégories ;
    • les catégories des livres.
  2. En utilisant les positions dans les prédicats, écrire des expressions qui retournent :
    • le titre du premier livre ;
    • le titre du dernier livre ;
    • l’auteur du troisième item ;
    • les catégories du second et de l’avant-dernier livre ;
  3. En utilisant des expressions de chemin dans les prédicats, écrire des expressions qui retournent :
    • Les catégories ayant une note
    • Les livres ayant au moins deux auteurs.
  4. Sans restrictions sur l’utilisation des axes et des fonctions, écrire les expressions qui retournent :
    • le code de la catégorie "Science" ;
    • le titre des livres de la catégorie "CS" ;
    • le titre des livres et des items indisponibles.
      Attention, un livre ou item dont la quantité est inconnue est considéré comme indisponible ;
    • les livres dont le titre contient le mot "Art" (quelque soit la casse) ;
    • les livres dont le nom d’au moins un auteur comporte entre 5 et 15 lettres ;
    • les livres ou les items dont l’auteur est "Bonner" ou la catégorie "F" ;
    • le texte sans balisage ;
    • les livres ou les items qui sont avant le premier item de la catégorie "X" ;
    • le livre qui suit immédiatement le dernier item de l’auteur "Bonner" ;
    • un livre sur deux ;
    • le (ou les) livre(s) du milieu de la liste ;
    • la description de la catégorie du premier livre ;

Que font les fonctions id() et document() ? Que doit contenir le document ? Proposer des exemples de requêtes utilisant ces fonctions :

  1. utiliser id() pour atteindre directement la description de la catégorie du premier livre ;
  2. écrire un document qui décrit tous les auteurs et leur associe un identifiant. Faire une copie de la bibliographie en remplaçant les auteurs par un élément qui contient leur identifiant ;
  3. écrire une requête qui retourne le premier auteur du dernier livre.