Portail collaboratif de partage de la connaissance
Bienvenue sur A525G, un portail collaboratif que tout le monde peut faire évoluer.
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.
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 |
Quantitative |
some/every $variable in expression |
Switch |
typeswitch expression
|
Ensemble |
union, intersect, except |
FLWR |
for, let, where, return |
Validation |
validate {expression} |
Chemin |
$variable/livre[@quantite=’5’]/auteur |
Constructeur |
|
Fonction |
|
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.
Le nom provient de for, let, where et return.
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>
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>
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>
XQuery inclut un grand nombre de fonctions et d'opérateurs. Il existe des fonctions pour :
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
Réagir à cet article
Aucun commentaire pour l'instant.