XQuery - Guide rapide

Qu'est-ce que XQuery

XQuery est un langage fonctionnel utilisé pour récupérer des informations stockées au format XML. XQuery peut être utilisé sur des documents XML, des bases de données relationnelles contenant des données au format XML ou des bases de données XML. XQuery 3.0 est une recommandation du W3C du 8 avril 2014.

La définition de XQuery telle que donnée par sa documentation officielle est la suivante -

XQuery est un langage standardisé pour combiner des documents, des bases de données, des pages Web et presque tout le reste. Il est très largement mis en œuvre. C'est puissant et facile à apprendre. XQuery remplace les langages middleware propriétaires et les langages de développement d'applications Web. XQuery remplace les programmes Java ou C ++ complexes par quelques lignes de code. XQuery est plus simple à utiliser et plus facile à entretenir que de nombreuses autres alternatives.

Caractéristiques

  • Functional Language - XQuery est un langage pour récupérer / interroger des données XML.

  • Analogous to SQL - XQuery est à XML ce que SQL est aux bases de données.

  • XPath based - XQuery utilise des expressions XPath pour naviguer dans les documents XML.

  • Universally accepted - XQuery est pris en charge par toutes les principales bases de données.

  • W3C Standard - XQuery est une norme W3C.

Avantages de XQuery

  • En utilisant XQuery, les données hiérarchiques et tabulaires peuvent être récupérées.

  • XQuery peut être utilisé pour interroger des structures arborescentes et graphiques.

  • XQuery peut être directement utilisé pour interroger des pages Web.

  • XQuery peut être directement utilisé pour créer des pages Web.

  • XQuery peut être utilisé pour transformer des documents xml.

  • XQuery est idéal pour les bases de données XML et les bases de données d'objets. Les bases de données d'objets sont beaucoup plus flexibles et puissantes que les bases de données purement tabulaires.

Ce chapitre explique comment configurer la bibliothèque XQuery dans un environnement de développement local.

Nous utilisons un processeur XQuery autonome open source Saxon Home Edition (Saxon-HE) qui est largement utilisé. Ce processeur prend en charge XSLT 2.0, XQuery 3.0 et XPath 3.0 et est hautement optimisé pour les performances. Le processeur Saxon XQuery peut être utilisé sans aucune base de données XML. Nous utiliserons un simple document XML comme base de données dans nos exemples.

Pour utiliser le processeur Saxon XQuery, vous devez avoir saxon9he.jar, saxon9-test.jar, saxon9-unpack, saxon9-xqj.jar dans le chemin de classe de votre application. Ces fichiers jar sont disponibles dans le fichier de téléchargementSaxonHE9-6-0-1J.zipTéléchargez SaxonHE9-6-0-1J.zip .

Exemple

Nous utiliserons le processeur Saxon XQuery basé sur Java pour tester books.xqy, un fichier contenant une expression XQuery par rapport à notre exemple de document XML, c'est-à-dire books.xml.

Dans cet exemple, nous verrons comment écrire et traiter une requête pour obtenir les éléments de titre des livres dont le prix est supérieur à 30.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

books.xqy

for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title

XQueryTester.java

package com.tutorialspoint.xquery;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;

import com.saxonica.xqj.SaxonXQDataSource;

public class XQueryTester {
   public static void main(String[] args){
      try {
         execute();
      }
      
      catch (FileNotFoundException e) {
         e.printStackTrace();
      }
      
      catch (XQException e) {
         e.printStackTrace();
      }
   }

   private static void execute() throws FileNotFoundException, XQException{
      InputStream inputStream = new FileInputStream(new File("books.xqy"));
      XQDataSource ds = new SaxonXQDataSource();
      XQConnection conn = ds.getConnection();
      XQPreparedExpression exp = conn.prepareExpression(inputStream);
      XQResultSequence result = exp.executeQuery();
      
      while (result.next()) {
         System.out.println(result.getItemAsString(null));
      }
   }	
}

Étapes pour exécuter XQuery sur XML

  • Step 1 - Copiez XQueryTester.java à n'importe quel emplacement, disons, E: > java

  • Step 2 - Copiez books.xml au même emplacement, E: > java

  • Step 3 - Copiez books.xqy au même endroit, E: > java

  • Step 4- Compilez XQueryTester.java à l'aide de la console. Assurez-vous que JDK 1.5 ou version ultérieure est installé sur votre ordinateur et que les chemins de classe sont configurés. Pour plus de détails sur l'utilisation de JAVA, consultez notre didacticiel JAVA

E:\java\javac XQueryTester.java
  • Step 5 - Exécuter XQueryTester

E:\java\java XQueryTester

Production

Vous obtiendrez le résultat suivant -

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Exemple de compréhension

  • books.xml représente les exemples de données.

  • books.xqy représente l'expression XQuery qui doit être exécutée sur books.xml. Nous comprendrons l'expression en détail dans le prochain chapitre.

  • XQueryTester, un programme exécuteur XQuery basé sur Java, lit le books.xqy, le transmet au processeur d'expression XQuery et exécute l'expression. Ensuite, le résultat est imprimé.

Exemple

Voici un exemple de document XML contenant les enregistrements d'une librairie de divers livres.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Voici un exemple de document Xquery contenant l'expression de requête à exécuter sur le document XML ci-dessus. Le but est d'obtenir les éléments de titre de ces nœuds XML dont le prix est supérieur à 30.

books.xqy

for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title

Résultat

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Vérifier le résultat

Pour vérifier le résultat, remplacez le contenu de books.xqy (indiqué dans le chapitre Configuration de l' environnement ) par l'expression XQuery ci-dessus et exécutez le programme java XQueryTester.

Expressions XQuery

Comprenons chaque élément de l'expression XQuery ci-dessus.

Utilisation des fonctions

doc("books.xml")

doc () est l'une des fonctions XQuery utilisées pour localiser la source XML. Ici, nous avons passé "books.xml". Compte tenu du chemin relatif, books.xml doit se trouver dans le même chemin où books.xqy est présent.

Utilisation d'expressions XPath

doc("books.xml")/books/book

XQuery utilise fortement les expressions XPath pour localiser la partie requise de XML sur laquelle la recherche doit être effectuée. Ici, nous avons choisi tous les nœuds de livre disponibles sous le nœud de livres.

Itérer les objets

for $x in doc("books.xml")/books/book

XQuery traite les données XML comme des objets. Dans l'exemple ci-dessus, $ x représente le nœud sélectionné, tandis que la boucle for itère sur la collection de nœuds.

Appliquer la condition

where $x/price>30

Comme $ x représente le nœud sélectionné, "/" est utilisé pour obtenir la valeur de l'élément requis; La clause "where" est utilisée pour mettre une condition sur les résultats de la recherche.

Renvoyer le résultat

return $x/title

Comme $ x représente le nœud sélectionné, "/" est utilisé pour obtenir la valeur de l'élément requis, prix, titre; La clause "return" est utilisée pour renvoyer les éléments des résultats de la recherche.

FLWOR est un acronyme qui signifie "For, Let, Where, Order by, Return". La liste suivante montre ce qu'ils représentent dans une expression FLWOR -

  • F - Pour - Sélectionne une collection de tous les nœuds.

  • L - Let - Place le résultat dans une variable XQuery.

  • W - Où - Sélectionne les nœuds spécifiés par la condition.

  • O - Trier par - Ordonne les nœuds spécifiés selon les critères.

  • R - Retour - Renvoie le résultat final.

Exemple

Voici un exemple de document XML contenant des informations sur une collection de livres. Nous utiliserons une expression FLWOR pour récupérer les titres de ces livres dont le prix est supérieur à 30.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Le document Xquery suivant contient l'expression de requête à exécuter sur le document XML ci-dessus.

books.xqy

let $books := (doc("books.xml")/books/book)
return <results>
{
   for $x in $books
   where $x/price>30
   order by $x/price
   return $x/title
}
</results>

Résultat

<title lang="en">Learn XQuery in 24 hours</title>
<title lang="en">Learn .Net in 24 hours</title>

Vérifier le résultat

Pour vérifier le résultat, remplacez le contenu de books.xqy (indiqué dans le chapitre Configuration de l' environnement ) par l'expression XQuery ci-dessus et exécutez le programme java XQueryTester.

XQuery peut également être facilement utilisé pour transformer un document XML en une page HTML. Jetez un œil à l'exemple suivant pour comprendre comment XQuery le fait.

Exemple

Nous utiliserons le même fichier books.xml. L'exemple suivant utilise XQuery pour extraire des données de books.xml et créer un tableau HTML contenant les titres de tous les livres ainsi que leurs prix respectifs.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Ci-dessous, l'expression Xquery qui doit être exécutée sur le document XML ci-dessus.

books.xqy

let $books := (doc("books.xml")/books/book)
return <table><tr><th>Title</th><th>Price</th></tr>
{
   for $x in $books   
   order by $x/price
   return <tr><td>{data($x/title)}</td><td>{data($x/price)}</td></tr>
}
</table>
</results>

Résultat

<table>
   <tr>
      <th>Title</th>
      <th>Price</th>
   </tr>
   <tr>
      <td>Learn XPath in 24 hours</td>
      <td>16.50</td>
   </tr>   
   <tr>
      <td>Learn Java in 24 Hours</td>
      <td>30.00</td>
   </tr>
   <tr>
      <td>Learn XQuery in 24 hours</td>
      <td>50.00</td>
   </tr>   
   <tr>
      <td>Learn .Net in 24 hours</td>
      <td>70.50</td>
   </tr>
</table>

Vérifier le résultat

Pour vérifier le résultat, remplacez le contenu de books.xqy (indiqué dans le chapitre Configuration de l' environnement ) par l'expression XQuery ci-dessus et exécutez le programme java XQueryTester.

Expressions XQuery

Ici, nous avons utilisé les expressions XQuery suivantes -

  • fonction data () pour évaluer la valeur de l'élément title, et

  • {} pour indiquer au processeur XQuery de considérer data () comme une fonction. Si l'opérateur {} n'est pas utilisé, alors data () sera traité comme du texte normal.

XQuery est compatible XPath. Il utilise des expressions XPath pour restreindre les résultats de la recherche sur les collections XML. Pour plus de détails sur l'utilisation de XPath, consultez notre didacticiel XPath .

Rappelez-vous l'expression XPath suivante que nous avons utilisée précédemment pour obtenir la liste des livres.

doc("books.xml")/books/book

Exemples XPath

Nous utiliserons le fichier books.xml et y appliquerons XQuery.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

Nous avons donné ici trois versions d'une instruction XQuery qui remplissent le même objectif d'afficher les titres de livres ayant une valeur de prix supérieure à 30.

XQuery - Version 1

(: read the entire xml document :)
let $books := doc("books.xml")

for $x in $books/books/book
where $x/price > 30
return $x/title

Production

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

XQuery - Version 2

(: read all books :)
let $books := doc("books.xml")/books/book

for $x in $books
where $x/price > 30
return $x/title

Production

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

XQuery - Version 3

(: read books with price > 30 :)
let $books := doc("books.xml")/books/book[price > 30]

for $x in $books
return $x/title

Production

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Vérifiez le résultat

Pour vérifier le résultat, remplacez le contenu de books.xqy (indiqué dans le chapitre Configuration de l' environnement ) par l'expression XQuery ci-dessus et exécutez le programme java XQueryTester.

Les séquences représentent une collection ordonnée d'éléments où les éléments peuvent être de types similaires ou différents.

Créer une séquence

Les séquences sont créées en utilisant des parenthèses avec des chaînes entre guillemets ou des guillemets doubles et des nombres en tant que tels. Les éléments XML peuvent également être utilisés comme éléments d'une séquence.

Expression XQuery

let $items := ('orange', <apple/>, <fruit type="juicy"/>, <vehicle type="car">sentro</vehicle>, 1,2,3,'a','b',"abc")
let $count := count($items)
return
<result>
   <count>{$count}</count>
   
   <items>
      {
	     for $item in $items
         return <item>{$item}</item>
      }
   </items>
   
</result>

Production

<result>
   <count>10</count>
   <items>
      <item>orange</item>
      <item>
         <apple/>
      </item>
      <item>
         <fruit type="juicy"/>
      </item>
      <item>
         <vehicle type="car">Sentro</vehicle>
      </item>
      <item>1</item>
      <item>2</item>
      <item>3</item>
      <item>a</item>
      <item>b</item>
      <item>abc</item>
   </items>
</result>

Affichage des éléments d'une séquence

Les éléments d'une séquence peuvent être itérés un par un, en utilisant l'index ou par valeur. L'exemple ci-dessus a itéré les éléments d'une séquence un par un. Voyons les deux autres moyens d'action.

Expression XQuery (index)

let $items := (1,2,3,4,5,6)
let $count := count($items)
return
   <result>
      <count>{$count}</count>
      
      <items>
      {
         for $item in $items[2]
         return <item>{$item}</item>
      }
      </items>
      
   </result>

Production

<result>
   <count>6</count>
   <items>
      <item>2</item>
   </items>
</result>

Expression XQuery (valeur)

let $items := (1,2,3,4,5,6)
let $count := count($items)
return
   <result>
      <count>{$count}</count>
      
      <items>
      {
         for $item in $items[. = (1,2,3)]
         return <item>{$item}</item>
      }
      </items>
      
   </result>

Production

<result>
   <count>6</count>
   <items>
      <item>1</item>
      <item>2</item>
      <item>3</item>
   </items>
</result>

Le tableau suivant répertorie les fonctions de séquence couramment utilisées fournies par XQuery.

Sr. Non Nom et description
1

count ($ seq comme article () *)

Compte les éléments dans une séquence.

2

somme ($ seq comme élément () *)

Renvoie la somme des éléments dans une séquence.

3

avg ($ seq comme élément () *)

Renvoie la moyenne des éléments d'une séquence.

4

min ($ seq comme élément () *)

Renvoie l'élément de valeur minimale dans une séquence.

5

max ($ seq comme élément () *)

Renvoie l'élément de valeur maximale dans une séquence.

6

valeurs-distinctes ($ seq comme item () *)

Renvoie sélectionner des éléments distincts dans une séquence.

sept

sous-séquence ($ seq comme item () *, $ startingLoc comme xs: double, $ length comme xs: double)

Renvoie un sous-ensemble de la séquence fournie.

8

insert-before ($ seq as item () *, $ position as xs: integer, $ inserts as item () *)

Insère un élément dans une séquence.

9

remove ($ seq comme élément () *, $ position comme xs: entier)

Supprime un élément d'une séquence.

dix

reverse ($ seq comme élément () *)

Renvoie la séquence inversée.

11

index-of ($ seq comme anyAtomicType () *, $ target comme anyAtomicType ())

Renvoie les index sous forme d'entiers pour indiquer la disponibilité d'un élément dans une séquence.

12

dernier()

Renvoie le dernier élément d'une séquence lorsqu'il est utilisé dans l'expression de prédicat.

13

position()

Utilisé dans les expressions FLOWR pour obtenir la position d'un élément dans une séquence.

Le tableau suivant répertorie les fonctions de manipulation de chaînes couramment utilisées fournies par XQuery.

Sr. Non Nom et description
1

string-length ($ string as xs: string) as xs: integer

Renvoie la longueur de la chaîne.

2

concat ($ input as xs: anyAtomicType?) as xs: string

Renvoie la chaîne concaténée en sortie.

3

string-join ($ sequence comme xs: string *, $ delimiter comme xs: string) comme xs: string

Renvoie la combinaison d'éléments dans une séquence séparés par un délimiteur.

Le tableau suivant répertorie les fonctions de date couramment utilisées fournies par XQuery.

Sr. Non Nom et description
1

date actuelle()

Renvoie la date actuelle.

2

heure actuelle()

Renvoie l'heure actuelle.

3

current-dateTime ()

Renvoie à la fois la date actuelle et l'heure actuelle.

Voici la liste des fonctions d'expression régulière couramment utilisées fournies par XQuery

Sr. Non Nom et description
1

correspond ($ input, $ regex)

Renvoie true si l'entrée correspond à l'expression régulière fournie.

2

replace ($ input, $ regex, $ string)

Remplace la chaîne d'entrée correspondante par la chaîne donnée.

3

tokenize ($ input, $ regex)

Renvoie une séquence d'éléments correspondant à l'expression régulière.

XQuery fournit une construction if-then-else très utile pour vérifier la validité des valeurs d'entrée passées. Ci-dessous, la syntaxe de la construction if-then-else.

Syntaxe

if (condition) then
 ... 
else
 ...

Exemple

Nous utiliserons le fichier books.xml suivant et lui appliquerons l'expression XQuery contenant une construction if-then-else pour récupérer les titres de ces livres avec une valeur de prix supérieure à 30.

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author>
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
</books>

L'expression XQuery suivante doit être appliquée au document XML ci-dessus.

books.xqy

<result>
{
   if(not(doc("books.xml"))) then (
      <error>
         <message>books.xml does not exist</message>
      </error>
   )
   else ( 
      for $x in doc("books.xml")/books/book	
      where $x/price>30
      return $x/title
   )
}
</result>

Production

<result>
   <title lang="en">Learn .Net in 24 hours</title>
   <title lang="en">Learn XQuery in 24 hours</title>
</result>

Vérifiez le résultat

Pour vérifier le résultat, remplacez le contenu de books.xqy (indiqué dans le chapitre Configuration de l' environnement ) par l'expression XQuery ci-dessus et exécutez le programme java XQueryTester.

XQuery offre la possibilité d'écrire des fonctions personnalisées. Vous trouverez ci-dessous les instructions pour créer une fonction personnalisée.

  • Utilisez le mot-clé declare function pour définir une fonction.

  • Utiliser les types de données définis dans le schéma XML actuel

  • Entourez le corps de la fonction dans des accolades.

  • Préfixez le nom de la fonction avec un espace de noms XML.

La syntaxe suivante est utilisée lors de la création d'une fonction personnalisée.

Syntaxe

declare function prefix:function_name($parameter as datatype?...)
as returnDatatype?
{
   function body...
};

Exemple

L'exemple suivant montre comment créer une fonction définie par l'utilisateur dans XQuery.

Expression XQuery

declare function local:discount($price as xs:decimal?,$percentDiscount as xs:decimal?)
as xs:decimal? {
   let $discount := $price - ($price * $percentDiscount div 100) 
   return $discount
};

let $originalPrice := 100

let $discountAvailed := 10

return ( local:discount($originalPrice, $discountAvailed))

Production

90

Vérifiez le résultat

Pour vérifier le résultat, remplacez le contenu de books.xqy (indiqué dans le chapitre Configuration de l' environnement ) par l'expression XQuery ci-dessus et exécutez le programme java XQueryTester.