Dernière mise à jour :2008-07-24

informatique

Ce qu’il y a de bien avec le XML c’est bien sûr sa capacité d’extension (comme son nom l’indique) ou encore d’adaptation à n’importe quel ensemble de données. En effet, avec XML vous pouvez représenter des pages web, des services web, des images, des systèmes vocal (voice XML) etc…

Au moment où j’écris ce texte, de plus en plus de développeurs font la création ou convertissent des applications qui entreposent les données au format XML.

Plus la quantité d’information s’accroît, plus le besoin de pouvoir chercher et mettre à jour ces données augmente aussi.

La recherche en mode texte se révèle beaucoup trop simple et le langage SQL ne peut s’adapter correctement à XML.

Depuis le mois d’octobre 1999 le W3C travail sur ce problème. Le fruit des efforts du consortium (encore en développement) est le langage XML Query ou si vous préférez, XQuery.

Ce langage a donc été conçu pour permettre de créer des requêtes précises tout en pouvant s’adapter à tout type de source de données XML, qu’il soit question de bases de données, documents XML ou autres.

XQuery peut être utilisé avec des documents XML validés par des schémas, des DTD ou encore simplement des documents XML bien formés.

Les bases de XQuery

XQuery est un langage basé sur les expressions. Un script ou programme XQuery contiendra toujours une ou plusieurs expressions et optionnellement des fonctions et des définitions.

En XQuery, il existe plusieurs types d’expressions dont voici une partie de la liste :

Type d'expression

Syntaxe

Séquence

expression, expression, …

Variable

$a, $variable

Constante

'a525g', "XQuery", 100

Numérique

+, -, *, div, idiv, mod

Comparaison générale

=, !=, <, >, <=, >=

Comparaison de valeurs

eq, ne, lt, le, gt, ge

Comparaison de noeuds

is, isnot

Comparaison d’ordre

<<, >>

Logique

and, or

Conditionnelle

if expression
then expression
else expression

Quantitative

some/every $variable in expression
satisfies expression

Switch

typeswitch expression
 case type $variable
  return expression
 default $variable
  return expression

Ensemble

union, intersect, except

FLWR

for, let, where, return

Validation

validate {expression}

Chemin

$variable/livre[@quantite=’5’]/auteur

Constructeur

 

Fonction

 

Expressions de chemin

Les expressions de chemin ressemble beaucoup à celles que l'on retrouve dans le langage XPath. Prenons par exemple le document suivant dans lequel l’attribut «num» représenterait un numéro associé à un élève et la valeur de la balise, la note de celui-ci.

<examen>
 <note num="001">80</note>
 <note num="012">75</note>
 <note num="525">99</note>
 <note num="601">60</note>
</examen>

Examinons maintenant l'expression de chemin suivante :

//examen/note[@num=$a]/text()

Assument que la variable $a contienne une valeur numérique constitué de trois chiffres, l’expression retournerait le texte contenu dans le nœud dont la valeur de l’attribut num est égale à celui de la variable.

Les expressions FLWR (prononcé flower)

Le nom provient de for, let, where et return.

  • for : Fourni un mécanisme d'itération.
  • let : Permet l'assignation de variable.
  • where : Les clauses for et let génèrent un ensemble de noeuds qui peuvent être filtré par un ou plusieurs prédicats dans une clause where.
  • return : Génère le résultat de l'expression FLWR.

Voici un exemple simple d'une requête FLWR. Cette requête a pour but de présenter une comparaison des prix des livres similaires (ayant le même titre) dont l'auteur est Stephen King dans deux librairies affichant leurs produits sur le web.

<livres>
{
for $a in document("http://www.libraire1.com/livres.xml")//livres/livre[auteur='Stephen King'],
$b in document("http://www.libraire2.com/produits.xml")//produits/livre[@auteur='Stephen King']
where $a/titre = $b/titre
return
<livre>
<prix1>{$a}</prix1>
<prix2>{$b}</prix2>
<livre>
}
</livres>

Les expressions conditionnelles

Comme dans la majorité des langages de programmation, XQuery offre la possibilité d'utiliser les mots-clef if, then et else. Par exemple, pour un document XML comme celui-ci :

<livres>
   <livre qte="1">
     <titre></titre>
   </livre>
   <livre qte="0">
     <titre></titre>
   </livre>
   <livre qte="3">
     <titre></titre>
   </livre>
</livres>

Si nous désirons écrire «oui» dans le cas où la quantité en stock est supérieure à 0 et non dans le cas où elle est égale à 0, nous pourrons écrire :

for $a in document("livres.xml")//livres
return
   <titre>{$a/titre}</titre>
   <enstock>
     if ($b[@qte='0'])
     then 'oui'
     else 'non'
   </enstock>

Les constructeurs

La construction de nouveaux contenu XML est fondamentale en XQuery. XQuery contient des constructeurs pour des éléments, des attributs, des sections CDATA, des instructions de traitement et des commentaires utilisant une syntaxe qui est la même sinon presque, que le XML lui-même. Le contenu des éléments et les valeurs des attributs peuvent contenir des expressions placées entre accolades {} qui seront évaluées. Par exemple :

let $a := 'a525g.com'
let $b := 'Portail a525g'
return
   <site url="{$a}">
     {$b}
   </site>

Le résultat de l'aévaluation de ce code donnerait ceci :

<site url="a525g.com">
   Portail a525g
</site>

Les fonctions

XQuery inclut un grand nombre de fonctions et d'opérateurs. Il existe des fonctions pour :

  • chaînes de caractères
  • mathémathiques
  • comparaison de dates
  • expressions régulières
  • noeuds XML
  • convertion de types
  • etc...

Il est aussi possible de définir nos propre fonctions. Les fonctions sont la plupart du temps dans l'espace de nommage (namespace) «fn». Cet espace de nommage est associé à «http://www.w3.org/11/xquery-functions». Celui-ci est utilisé dans le but d'éviter les collision au niveau de la définition de noms.

Comme mentionné ci-dessus, il est possible de définir nos propre fonctions. Reprenons le document XML utilisé ci-dessus pour démontrer les opérations de comparaison et ajoutons des éléments au document.

<livres>
   <livre qte="1">
     <titre>Harry Potter et l'Ordre du Phénix</titre>
     <auteur>Joanne K. Rowling</auteur>
   </livre>
   <livre qte="0">
     <titre>Sac d'os</titre>
     <auteur>Stephen King</auteur>
   </livre>
   <livre qte="3">
     <titre>Une seconde chance </titre>
     <auteur>Mary Higgins Clark</auteur>
   </livre>
   <livre qte="5">
     <titre>Carrie</titre>
     <auteur>Stephen King</auteur>
   </livre>
   <livre qte="2">
     <titre>Trente ans déjà</titre>
     <auteur>Mike Gayle</auteur>
   </livre>
</livres>

Il est possible de définir une fonction qui calculera la moyenne des quantités des livres figurant dans le document dont l'auteur est Stephen King.

define function moyenne-qte($auteur)
{
   let $doc := document("livres.xml")//livres/livre[auteur=$auteur]
   return avg($doc/.[@qte])
}

Auteur : Sylvain Bilodeau

Date de mise en ligne : 2003-07-29

Aucun commentaire pour l'instant.