> Tech > Concepts de base

Concepts de base

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

XQuery est strictement sensible à la casse, ses mots-clés sont en minuscule. Il peut travailler avec du contenu XML typé (validé par un schéma) ou non typé. Sachez toutefois que le travail sur le contenu typé est plus rapide, car il évite une conversion implicite de type lors du traitement.

Concepts de base

XQuery est, comme SQL, un langage fortement typé.

Si un paramètre est passé à une fonction XQuery, celui-ci doit être du type attendu. Si le XML est non typé, une conversion implicite est tentée. Si par contre le contenu XML est typé, vous devez explicitement transtyper votre paramètre si nécessaire. Précisons également la nomenclature : on appelle noeud un élément ou un attribut, son identifiant est un QName (Qualified Name), c’est-à-dire un nom, possiblement qualifié par un espace de noms. La donnée scalaire que contient ce noeud est nommée valeur atomique. Un item est soit un noeud, soit une valeur atomique. Une séquence est une liste comportant de zéro à plusieurs items.

XPath

XQuery est basé sur XPath 2.0, un langage permettant de parcourir le document pour retrouver un noeud ou un valeur atomique. Vous pouvez très simplement dessiner un chemin d’élément à sous-élément et filtrer le noeud recherché. Le filtrage se fait à l’aide d’un prédicat contenu entre crochets [], qui applique son contenu (une expression évaluée à vrai ou faux) au contexte du chemin. Par exemple, dans notre XML, le chemin pour trouver le premier coup du troisième pion blanc peut être exprimé en XPath ainsi :

/echiquier/blancs/pieces/pion[@numero = "3"]/historique/coup[@sequence = "1"]

Un chemin est composé d’une suite de noeuds (des étapes) séparés par des /. Chaque étape comporte un axe, qui spécifie la direction du mouvement, un test de noeud (le QName de l’élément ou de l’attribut) et peut introduire des expressions de filtre, nommées qualificateurs d’étapes (step qualifiers). L’axe peut être explicite, ou abrégé.

Par exemple, l’exemple ci-dessus avec axes explicites donne :
self::node()/child::echiquier/child::blancs/child::pieces/child::pion[attribute:: numero = "3"]/child::historique/child::coup[attribute::sequence = "1"] ::

étant le séparateur d’axe. Vous avez compris que child est l’axe par défaut, et que attribute:: s’abrège « @ ». Le noeud parent s’abrège « .. », et le noeud actuel (le noeud de contexte), « . ».

Vous pouvez également sauter des étapes et chercher des sous-noeuds dans tous les enfants, en utilisant la syntaxe // (déconseillée pour des raisons de performance, et les risques encourus en cas de changement de structure). Pour retourner des noeuds au même niveau mais portant des QNames différents, vous pouvez utiliser le caractère générique *.

Prologue
Le type XML supporte les espaces de noms (namespaces, recommandation W3C ), qui sont des identificateurs de vocabulaire, permettant d’attribuer un noeud à un vocabulaire.

Si le contenu de la colonne ou de la variable les utilise, la requête XQuery doit déclarer les namespaces avec lesquels elle va travailler. Cette déclaration peut se faire en ligne – à l’intérieur de la requête Xquery – à l’aide d’un prologue, ou en préfixe à la requête SQL (au SELECT) dans laquelle on va écrire des requêtes XQuery. Cette deuxième solution est à préférer pour améliorer la lisibilité du code, et pour éviter une redéclaration dans les diverses requêtes. La recommandation W3C indique que le prologue contient une suite de déclarations diverses séparées par des points-virgule.

En SQL Server, il ne peut contenir que des déclarations d’espaces de noms. Exemple avec une déclaration de namespaces en prologue :
SELECT joueurs.query(‘
declare namespace
ecj="http://www.babaluga.com/xmlnamespaces/echecs/joueur";
/joueurs/ecj:joueur[@position = "blancs"]’)
FROM #partie

La déclaration en préfixe de la requête utilise la syntaxe SQL suivante :
WITH XMLNAMESPACES (‘urn’ as alias, ‘urn2’ as alias2) …?

Exemple : WITH XMLNAMESPACES (‘http://www.babaluga.com/xmlnamespaces/echecs/joueur’ as e)
SELECT joueurs.query(‘/joueurs/e:joueur[@position = "blancs"]’)
FROM #partie

Le mot-clé WITH étant déjà utilisé dans la syntaxe T-SQL pour spécifier des options de requête par exemple, l’utilisation de WITH XMLNAMESPACES dans un lot de requêtes doit être précédée de la fermeture de l’instruction précédente par un ;.

Téléchargez cette ressource

Les mégatendances cybersécurité et cyber protection 2024

Les mégatendances cybersécurité et cyber protection 2024

L'évolution du paysage des menaces et les conséquences sur votre infrastructure, vos outils de contrôles de sécurité IT existants. EPP, XDR, EDR, IA, découvrez la synthèse des conseils et recommandations à appliquer dans votre organisation.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010