XPath dans Squeak
From OFSET Wiki
XPath est un langage d'interrogation qui permet de rechercher des noeuds dans un document XML. XPath s'appuie sur un langage de type expression régulière pour l'expression des commandes de recherche.
Contents |
[edit] Installer XPath dans Squeak
Il faut ouvrir le menu world, choisir le menu "open" puis charger "squeakmap package loader" (l'installer si nécessaire). Ensuite rechercher XPath dans la liste en haut à gauche, click droit et enfin install.
[edit] Composition d'une commande XPath
Une commande XPath représente le chemin à parcourir pour obtenir les noeuds correspondants. Elle est composé de caractères particuliers et de nom d'attributs, de noeud, ou bien encore de fonctions :
- <nodename> : permet d'obtenir tous les fils du noeud nommé <nodename>
- / : permet d'obtenir tous les fils de la racine
- // : permet d'obtenir tous les noeuds
- . : permet d'obtenir le noeud courant
- .. : permet d'obtenir le noeud père du noeud courant
- @<att> : permet d'obtenir les attributs nommé <att> du noeud courant
- * : permet d'obtenir tous les noeuds fils
- @* : permet d'obtenir tous les attributs du noeud courant
[edit] Exemples de commandes
Passons maintenant à quelques petits exemples pour montrer comment est structurer une commande. On va utiliser le document XML suivant :
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore>
- Pour obtenir les éléments fils des noeuds nommé book, on peut saisir :
- /book : qui indique que book est le fils de la racine
- title/.. : qui indique que book est le père de title
- price/.. : qui indique que book est le père de price
- //book" : qui indique que l'on recherche dans TOUT le document XML
- Pour obtenir le contenu de l'élément title, on peut saisir :
- //title : qui indique que l'on recherche un élément nommé title sans connaître sa position dans l'arbre
- book/title : qui indique que l'élément recherché est le fils de book
- /book/title : qui indique que l'élément recherché est le fils de book qui est lui même un fils de la racine
- /*/title : qui indique que l'élément recherché est un petit-fils de la racine
- Pour obtenir les attributs de l'élément title, on peut saisir les même commandes que précédemment en rajoutant /@ comme par exemple ://title/@
- Pour obtenir les attributs lang, on peut saisir :
- les mêmes commandes que pour obtenir le contenu de title en rajoutant /@lang comme par exemple //title/@lang
- //@lang : qui indique qu'un élément du document XML à un attribut lang
[edit] Syntaxe
Voici comment utiliser XPath dans Squeak :
| command document results | command := ... document := XMLDOMParser parseDocumentFromFileNamed:aFilename. results := (XPath for: command) in:document.
on peut constater que 3 éléments sont importants pour utiliser XPath :
- document : qui représente le document XML où la recherche sera effectuée
- command : qui représente la recherche à effectuer. Il s'agit d'une commande conforme à la description de la partie précédente.
- results : un OrderedCollection qui contient les noeuds résultats de la recherche dans le document
Voici un exemple d'utilisation de XPath dans Squeak :
- on suppose que document représente le document XML des exemples précédents
results := (XPath for:'/book/title/@lang') in:document. results do: [:e | Transcript show:e].
On verra apparaître dans le Transcript : eng puis eng
[edit] Fonctions et opérateurs
XPath permet d'utiliser des fonctions pour obtenir des informations particulières :
- count(node) : qui permet d'obtenir le nombre de noeuds nommés node
- text(node) : qui permet d'obtenir le contenu (le texte) dans le noeud nommé node
- last() : qui permet d'obtenir le dernier élément du noeud courant
[edit] Parcours
Prenons un exemple de parcours : on souhaite lister tous les noeuds de l'arbre exemple sauf la racine. L'arbre est supposé stocké dans document. On souhaite obtenir le résultat sous forme de collection.
|results col coltmp|
col := OrderedCollection new.
results := (XPath for:'/*') in:document.
results do:[
:e |
col add:e.
coltmp := (XPath for:'/*') in:e.
coltmp do:[
:f |
col add:f.]].
^col.
Dans cet exemple, on remarque que le parcours d'un document XML est fortement récursif, il serait donc plus approprié de faire 2 méthodes distincts:
- la première initialisant la recherche au fils de la racine. Elle serait donc dans le style suivant :
parcours:document |results col | results := (XPath for:'/*') in:document. col := OrderedCollection new. results do: [:e | col add:e. self parcoursNoeud: e dans:col]. ^col
- la seconde effectuant la recherche à partir d'un noeud, et s'appelant elle même pour passer au noeud suivant :
parcoursNoeud:noeud dans:col |results| results := (XPath for:'/*') in:document. results do: [:e | col add:e. self parcoursNoeud: e dans:col]. ^col.
on peut ainsi parcourir un arbre avec autant de noeuds possibles alors que dans la version précédente seuls les noeuds jusqu'au petit fils de la racin était listé. Le principe est donc le suivant :
- on liste les noeuds de la racine : (XPath for:'/*') in:document.
- on parcours la collection obtenue en ajoutant le noeud à la collection finale : col add:e
- on liste les noeuds du noeud, pour cela on prend comme racine le noeud : self parcoursNoeud: e dans:col

