XQuery, outil de requête – format XML

By 20 March 2012

XQuery, outil de requête – Chapitre 6.

Avant de passer en la partie du mémoire consacrée aux requêtes portant sur le document XML, nous présentons ici XQuery, outil de requête qui sera utilisé.
Nous en brossons un bref historique et tentons d’en décrire le fonctionnement, une compréhension du modèle interne pouvant aider à son utilisation.

Nb.: nous utiliserons des termes techniques en langue anglaise, les ouvrages lus à propos de XQuery étant rédigés en langue anglaise, nous préférons utiliser le vocabulaire existant que de tenter une traduction maladroite.

1-Historique.

Le format XML ayant été largement adopté, une profusion de documents XML, bases de données XML sont apparus. Il est devenu nécessaire de disposer d’un outil permettant d’extraire des données de ces fichiers XML, présenter des résultats, effectuer des recherches au sein de bases de données XML, etc.
Le W3C est à l’origine de cette démarche qui allait devenir XQuery, lorsqu’en décembre 1998, un groupe de travail fut créé, pour devenir officiel en septembre 1999 où il prit l’appellation de
« working group for XML Query », généralement raccourci par « query working group ».
Une des premières tâches du « query working group » fut de déterminer si les moteurs de recherche existants, comme SQL parvenu à maturité et devenu un standard largement utilisé dans le monde des données relationnelles, ne pouvait être utilisé moyennant des extensions pour des données au format XML.
Des différences sont apparues au fil de cette étude.

Citons les différences entre la structure des données: deux dimensions pour les données relationnelles (tableau lignes colonnes), quand les données XML « taguées » ont une profondeur non prévisible.
Ou bien la différence entre l’homogénéité des données relationnelles qui permet les metadata pour les décrire, opposées à l’hétérogénéité des données XML dont les metadata se retrouvent dans tout le document.
Ou encore, la notion d’ordre des données qu’il est nécessaire de respecter en XML, ce qui n’est pas le cas en base de données relationnelles.
Il en est d’autres, notre liste n’est pas exhaustive.

Cela a mené le « query working group » à la décision de définir un design propre pour XQuery. Quelques lignes conductrices de cette tâche ont été:
– XQuery sera une transformation du Query Data Model – Compatibilité avec Xpath
– Conformité au schéma XML
– Souplesse d’application, tant à des documents validés par un XML Schema, que par une DTD ou bien non validés.

2-L’influence de Xpath.

Xpath, une recommandation du W3C datant de novembre 1999, était déjà largement utilisé par la communauté XML.
Xpath est un outil de recherche simple pour documents XML, permettant la navigation dans le document.
L’influence de Xpath se trouve dans l’intégration des « path » au sein de XQuery, un parcours de l’arbre qui retourne les « nodes », leur position et position relative, leur type et contenu.
Une expression Xpath assure la sélection de « nodes » au sein du document et est à même de les filtrer par le biais de prédicats.
La notion d’expression et prédicat a également été retenue.

3-L’influence de XML Schema.
XML SCHEMA est un langage qui crée des schémas de validation pour documents XML. Il comporte de nombreux types (de données), permet d’en créer d’autres.
Les données d’un document XML et les types issus du schéma qui leur sont appliqués sont le « Post-Schema Validation Infoset » ou « PSVI ».
Le design de XQuery a été conçu pour une compatibilité avec le typage défini dans XML Schema.

4-Autres sources.

Plusieurs « query languages » existants ont influencé XQuery, des membres du « query work group » ayant auparavant contribué au développement de ces langages.
Le plus proche parent de XQuery est QUILT , une proposition de membres du « query work group ».
La proposition du langage QUILT comportait un des composants essentiels de XQuery: FLWOR (pour For-Let-Where-Order-Return), un équivalent du (select-from-where) du monde SQL.
QUILT retenait également de XML-QL la notion de « constructor » , où « where » génère un ensemble de tuples et variables liées; « construct » s’exécute pour chacun de ces tuples , ce qui génère des éléments de sortie.

5-XQuery recommandation W3C.

Le 23 janvier 2007, soit après neuf années, XQuery est devenu une recommandation du W3C .

6-Fonctionnement de XQuery.

Notre décrivons de façon très simplifiée le processus de traitement de XQuery.
Le W3C divise le processus que nous résumons en deux parties:
– l’une assimilée à une démarche « externe » à XQuery, traitant le document XML – la seconde « interne » et coeur de XQuery traitant la requête XQuery.
Notons que ces deux « parties » se produisent au sein du même processus XQuery, et ne sont pas perceptibles pour l’utilisateur.

Fonctionnement de XQuery

1. Traitement « externe ».

Un input, le document XML sur lequel porte la requête XQuery, est traité par un parser.
Lors du parsing est créé le « XML Information Set » modélisant le document sous forme d’une hiérarchie de « nodes ».
Les « nodes » sont identifiés et notés dans un « document order » complété à chaque « node » rencontré.
La finalité du « document order » est de retenir l’ordre du document XML afin que les requêtes puissent s’y référer, et de restituer cet ordre en sortie de traitement.
Le document est ensuite validé par comparaison à sa DTD ou son Schema XML. Le « XML Information Set » est alors transformé en « XQuery Data Model ».

2. Traitement « interne ».

XQuery procède ensuite à deux phases.
Un input qui est la requête XQUERY, est parsé durant la « phase d’analyse statique ».
Si l’ « analyse statique » valide la requête, intervient la « phase d’évaluation dynamique », au cours de laquelle les valeurs des expressions sont traitées .
Enfin intervient la sérialisation (la seconde phase), qui est la transformation du data model en flux d’octets, autrement exprimé, le résultat de la requête en XML.

7-Le processeur XQuery.

XQuery a un processeur, solution logicielle qui effectue l’ « analyse syntaxique », l’ « évaluation dynamique » et l’exécution de la requête.
Ce processeur se charge également de « parser » le document XML, en créer le « XML Infoset » et le « XQuery data model ».
Le processeur retourne un résultat soit au format XML (la sérialisation) qui peut être soit affiché, ou bien passé à une autre application pour un traitement ultérieur.

8-Le datamodel.

Le data model est une représentation formelle des données d’un document XML qui fera l’objet d’un traitement XQuery.
XQuery est défini comme une transformation d’une instance du query data model en une autre instance du data model.
Cette représentation défini chaque donnée, tant en position au sein du document qu’en termes de type.
Cette définition est utilisée en input de la requête, en output (le résultat de la requête) ainsi qu’en résultat intermédiaire.
Le data model de XQuery est « XQuery 1.0 et Xpath 2.0 » ou « XDM ».
Il est partiellement issu du data model de Xpath qui a été enrichi par des informations issues du Post-Schema Validation Infoset (PSVI de XML SCHEMA).
« XDM » est utilisé simultanément par XQuery 1.0 et Xpath 2.0 .
Le « XDM » organise et représente les données au travers de: « Sequence », « Item », « Atomic Value » et « Nodes ».
Le processeur XQuery
Sequence
Item

Node
(7 nodes XPath)
Atomic Value

– Une « sequence » est un ensemble ordonnancé de zéro, un ou plusieurs items.
– Un « Item » est un « node » ou bien une « Atomic value ».
– Une « Atomic value » est une valeur simple, non marquée, ne contenant pas d’autre valeur, elle
correspond à un type provenant des « atomic types » définis par le XML Schema.
– Un « node » est issu d’un des 7 « nodes » de Xpath (Element nodes, Attributes, Documents, Text,
Comments nodes, Namespace, Processing Instruction nodes).
Dans ce mémoire, nous considérons essentiellement Les « Element nodes » et « Attributes nodes ».
Une « sequence » sera par exemple constituée de trois « item » qui sont des « nodes » de type « element ».
XQuery est un langage fort typé.
Dès lors, chaque « item » et/ou « node » doit correspondre à des types définis par le XDM ou XML Schema.
En admettant une certaine souplesse toutefois: des « items » non typés (par exemple lorsqu’il n’existe pas de document de validation) sont convertis automatiquement dans le type nécessaire à l’opération souhaitée.
« XDM » représentera le document XML hiérarchiquement.
Son élément racine est « Document node », qui sera suivi hiérarchiquement par, ou bien sera parent de, l’élément « node » racine du document XML, lui-même parent des éléments du document traité.

9-Les Expressions XQuery.

L’outil essentiel de XQuery pour l’évaluation est l’ expression. Plusieurs catégories d’expressions existent.
Nous ne les citons pas toutes, simplement celles qui seront utilisées pour la suite de ce travail.
– Path: une expression path permet de naviguer dans le document sur lequel porte la requête.
– Comparaisons: =,<,>, !, etc permet de comparer les valeurs, nodes. – Conditions: if, then, else
– « Constructor »: permet d’exprimer le résultat de la requête sous forme de document XML ou
XHtml, donc de baliser le résultat au moyen de tags < >, de créer des éléments et attributs.
Le « Constructor » permet également de construire des valeurs atomiques. – Arithmetic: qui permet d’additionner, soustraire, diviser, multiplier.
– FLWOR: qui est l’équivalent du SQL select-from-where, For-Let-Where-Order-Return.
Nous revenons plus en détail sur deux des expressions que nous utilisons: Path et FLWOR.

10-Expression Path.

Une « expression path » permet de naviguer dans le document sur lequel porte la requête.
La fonction d’appel « doc » retourne le « document node » du document XML à transformer.
doc (“/home/Memoireulb/abc.xml”) //ABC/client/commande
Le « document node » de abc.xml est retourné à l’appel de la fonction « doc », « premier path » de « doc ».
La suite du « path » est évaluée par rapport à ce premier « document node » qui est un « context
node ».
Le « second step » vers « ABC »: « ABC » devient le « context node » par rapport auquel est évaluée la séquence « client ».
Le « troisième step » vers « client »: « client » devient le « context node » par rapport auquel est évaluée la séquence « commande ».
XQuery fait usage de « predicat ».
Les « predicats ». sont intégrés dans les « path expressions » afin de filtrer les « nodes » utiles.
Par exemple [@nom_activite=”act3_logistique”] sélectionnera les « nodes activite » dont l’attribut « nom_activite » sera égal à « act3_logistique ».

11-Les requêtes FLWOR.

XQuery utilise des variables, qui sont précédées du signe $. Ex: $var. Une variable reçoit une valeur précise lors de l’évaluation XQuery.
FOR: associe une valeur à une variable de façon itérative. FOR suivi d’un PATH comme dans l’exemple suivant:
for $in in doc (“/home/Memoireulb/abc.xml”)//ABC/activite
associe à la variable $in de façon itérative une « activite » de la sequence. La requête FLWOR est exécutée pour chaque itération de la séquence.
LET: associe la séquence entière à une variable plutôt que chacun de ses item un à un comme FOR.
Dans l’exemple let $in in doc (“/home/Memoireulb/abc.xml”)//ABC/activite $in sera associé à la valeur de la séquence activité totale.
WHERE: on y défini les filtres, prédicats, conditions et jointures entre entités.
WHERE sélectionnera dans les items ceux qui correspondront au(x) prédicat(s) qu’il décrit.
ORDER BY: permet d’ordonnancer la valeur des résultats attendus (ordre croissant, décroissant, alphabétique).
RETURN suivi de l’expression qui est le résultat attendu retourne ce résultat.
Un item est retourné à chaque itération de la boucle FOR, ce qui créée une séquence d’items.
RETURN n’interrompt pas le déroulement de la boucle FOR.

Il est également tout à fait possible d’incorporer dans les sorties RETURN de nouvelles boucles conditionnelles.
Sources.
– W3C : http://www.w3.org/TR/2006/PR-xquery-20061121/
– XQuery from the Experts: A Guide to the W3C XML Query Language ISBN: 0-321-18060-7 – XQuery de Priscilia Walmsley ISBN: 0-596-00634-9

Lire le mémoire complet ==> (Application de la méthode Activity Based Costing, technologies XML)
Mémoire présenté en vue de l’obtention du grade de Licencié en Informatique et Sciences humaines
Université libre de Bruxelles, Faculté des sciences sociales politiques et économiques