Aymeric Lesert 28 Mars 2003 XML – QL : A Query Language for XML http://www.w3c.org/TR/NOTE-xml-ql/ (19 Août 1998) I. Introduction Avec l’explosion d’Internet, le W3C a été encouragé à chercher un format d’échanges d’information entre des applications distantes. Avant XML, il existait quelques modèles comme SGML ou BOD mais ils étaient trop spécialisés pour être exploité par les développeurs d’Internet. Le XML est un héritier de ces anciens formats. Il est, officiellement, naît le 10 février 1998. Ce qui a fait la force de ce format a été son interopérabilité, sa réutilisabilité et la mise à disposition d’outils facilitant son exploitation. II. Un document XML Un document XML est un fichier ASCII (mode caractère) permettant de décrire des informations ou capable de véhiculer des informations d’une application à une autre. Il se construit comme une page HTML sauf que les balises sont libres (ex : <INFO>). Un document XML a une définition récursive : Un champ : <NOM> Valeur </NOM> Un nœud : <INDIVIDU> Champ(s) ou Nœud(s) </INDIVIDU> <NOM> , </NOM>, <INDIVIDU> , </INDIVIDU> sont aussi appelés des balises. Il est possible d’attribuer aux balises des attributs <INDIVIDU Age=20 Taille=grand>. En général, un document XML est accompagné de deux autres fichiers, un DTD pour vérifier la bonne structure du fichier XML et d’un XSL pour le visualiser ou le transformer. Cette structure simple offre un grand pouvoir d’expressions, notamment, pour décrire des objets avec leurs attributs et supporte facilement l’évolution dans le contenu des informations (ajout ou suppression de champs). Sa structure hiérarchique est également très adaptée à une modélisation « objet ». III. Le langage d’interrogation XML-QL A priori, nous pouvons penser que XML-QL est redondant avec un fichier XSL. XSL transforme un document XML en un autre document (de forme quelconque : HTML, PS, XML, …) en extrayant tout ou partie des données présentes. XML-QL transforme un document XML en un autre document XML, seulement. Il dispose aussi d’opérations sur les données (extraction selon certains critères, jointure ou tri). Dans le cas de l’utilisation de XML-QL, nous pouvons définir : Un fichier DTD comme un schéma de base de données (Description des classes et des attributs), Un fichier XSL comme la présentation du résultat, Un nœud comme une instance d’une classe, Un champ comme un attribut d’un objet. A. Quelques éléments de syntaxe $<nom> fait référence à la valeur que l’on a fait correspondre avec un nœud ou un champ d’un document XML. Ex : <TITRE>$t</> : « t » fait alors référence à la valeur du champ TITRE. <$a> … </> : « a » fait référence au nom du nœud ou du champ répondant aux critéres. <..> …(valeur) … </> CONTENT_AS $a : « a » fait référence au contenu du nœud <..> … </> ELEMENT_AS $a : « a » fait référence au nœud B. Les opérations 1. Conversion d’un ou plusieurs XML XML-QL offre la possibilité d’interroger sur des données présentes dans plusieurs documents XML et le résultat des interrogations est toujours un autre document XML. 2. Extraction de champs ou de nœuds (WHERE … CONSTRUCT) Grâce à la technique du « pattern-matching », la clause WHERE permet d’identifier la partie du document XML correspondant à une interrogation. La clause CONSTRUCT décrit le contenu du document XML résultant de l’interrogation. DEA IA & OC (Université Paris VIII) Bases de données Aymeric Lesert 28 Mars 2003 XML – QL : A Query Language for XML http://www.w3c.org/TR/NOTE-xml-ql/ (19 Août 1998) 3. Le regroupement avec des interrogations imbriquées Comme le résultat d’une requête XML-QL est un document XML, il est possible de réaliser des requêtes imbriquées. Cela consiste a restreindre un premier domaine et à le soumettre à une autre interrogation pour, ensuite, réaliser des regroupements d’informations autour d’une donnée commune. 4. Jointure et Identité des éléments, IDs et IDREFs Dans un document XML, la jointure est réalisée par la correspondance pour une même variable d’une même valeur dans deux sélections. Pour faciliter la jointure, il existe deux types d’attribut (ID et IDREF). Le type d’attribut ID permet d’attribuer un identifiant unique à un objet (un nœud ou un attribut). Le type d’attribut IDREF permet de lier deux objets entre eux en faisant référence dans cet attribut à l’identifiant d’un objet existant et définit par le type d’attribut ID. 5. Création d’identité d’éléments (ID=Fonction($a1, … $a2)) Dans le cas du résultat d’une requête XML-QL, il est parfois nécessaire d’identifier les objets créés. Il existe, pour cela, un procédé qui consiste à attribuer un identifiant unique à chaque objet identifié par la suite d’arguments $a1, … $a2 regroupé sous l’identifiant « Fonction ». Ex : PersonID($Nom,$Prenom) attribue un identifiant unique à chaque paire distincte (Nom,Prenom) regroupé sous le concept « PersonID ». INSEEID($Numero_securite) attribut un identifiant unique à chaque N° INSEE différent regroupé sous le concept « INSEEID ». 6. Jointure externe et fonction de Skolémisation ( … { <Requête> } … ) Dans le langage SQL, les jointures externes permettent d’exprimer la possibilité de faire des jointures entre deux tables pouvant éventuellement ne pas satisfaire la condition de jointure. Cette fonctionnalité peut s’avérer également très utile dans une requête XML-QL, surtout si les données proviennent de sources différentes. Pour cela, il faut définir une requête XML-QL entre accolade « {» et « } ». 7. Tri des données (ORDER-BY .. [ASCENDING | DESCENDING]) Le tri s’applique uniquement sur des valeurs de champs. Le tri est soit croissant (par défaut), soit décroissant. 8. « Regular path expressions » ou Expressions régulières d’un chemin La nouveauté de ce langage, par rapport à SQL, est sa capacité à interroger sur des champs ou des nœuds dont le nom n’est pas précisé ou dont l’accès répond lui même à un critère de sélection. Il est alors possible de décrire sous forme d’expressions régulières (Cf. GREP) le chemin décrivant le nœud ou le champ à accéder. Ex : <part+.(subpart|component.piece)> <part><subpart></></> , <part><part><subpart></></></> ou <part><component><piece></></></> ou tout sous-arbre de nœud <part> contenant un attribut <subpart> ou un nœud <component> avec un attribut <piece> 9. Définition de fonctions (FUNCTION … END) Un document XML peut lui-même contenir une ou plusieurs requêtes XML-QL (définition par extension). Un fichier DTD peut contenir aussi des fonctions (ou des macros) permettant de factoriser certaines opérations d’extraction d’informations. C. Avantages Un tel langage offre la possibilité d’effectuer des interrogations sur des fichiers XML d’origines différentes (données ou structures). Le résultat d’une requête reste un document XML, éventuellement, réutilisable dans une autre requête. Nous stockons dans une base de données au format XML que les informations utiles (les champs vides peuvent être omis) et les relations de type pére-fils sont matérialisées par une sous-structure d’un objet (cela permet de gagner une jointure, une colonne et une clé étrangère dans une base de données relationnelles). Ces DEA IA & OC (Université Paris VIII) Bases de données Aymeric Lesert 28 Mars 2003 XML – QL : A Query Language for XML http://www.w3c.org/TR/NOTE-xml-ql/ (19 Août 1998) deux aspects permettent, dans certains cas, de réduire de manière substantielle la taille de la base de données par rapport à une base de données relationnelles comme Oracle ou SQLServer. D. Inconvénients Ce langage peut s’avérer très lent ou très gourmand en mémoire si l’utilisation de jointure devient important. La mise à jour (création, modification ou suppression) dans une base de données XML n’est pas gratuite ; il faut réécrire tout le fichier et il n’est pas possible de poser des index (accès direct à l’information). L’opération de « pattern-matching » est, également, très coûteuse en temps machine ; elle ne vaut pas un test de comparaison. IV. Conclusion L’idée n’est pas mauvaise mais les besoins ont évolués. Ce langage a été abandonné au profit de XQuery. Il est promu par le W3C et est plus proche des préoccupations des industriels. Ce nouveau langage adopte une philosophie qui tranche avec le langage SQL. C’est un langage d’interrogation proche d’un langage de programmation (php ou perl). L’avantage indéniable de données structurées font que les bases de données XML peuvent être intéressantes dans un système d’informations dont les sources sont hétéroclites mais limitées (pas trop grandes) si il existe une contrainte de temps et d’espaces. V. Annexe : Abréviations W3C World Wide Web Consortium : organisme chargé de promouvoir les technologies d’interopérabilité pouvant être utilisé par des applications Web (Spécification, Manuel d’utilisation, Logiciels ou outils). XML eXtensible Markup Language : modèle de représentation de données (fichier .xml) XSL eXtensible Stylesheet Language : décrit le style de représentation (dans un navigateur) du contenu d’un document XML (fichier .xsl) XSLT eXtensible Stylesheet Language Transformation : procédé permettant de réécrire un document XML en un autre document XML (en général, pour rendre un document XML compatible avec un système d’informations déjà existant) DTD Document Type Declaration : Définition d’une « bonne » structure d’un document XML (fichier .dtd) SGML Standard Generalized Markup Language : Ancêtre de XML BOD Business Object Document : définit par Open Applications Group SQL Structured Query Language : Langage utilisé pour l’interrogation commune des bases de données relationnelles (Comme Oracle, Access ou SQLServer). VI. Références W3C : http://www.w3.org/ : Site official de la W3C Version de travail du cahier des charges de XML-Query : http://xmlfr.org/actualites/tech/000201-0001 Tutorial de XML-QL : http://www.javacommerce.com/tutorial/xml/xmlql.html Bibliothèque Perl pour une utilisation de XML-QL : http://theoryx5.uwinnipeg.ca/mod_perl/cpan-search?dist=XML-QL Tutorial de XSL : http://www.zvon.org/xxl/XSLTutorial/Books/Book1/index.html Business Object Document : http://xml.coverpages.org/ni2002-04-06-b.html DEA IA & OC (Université Paris VIII) Bases de données Aymeric Lesert VII. 28 Mars 2003 XML – QL : A Query Language for XML http://www.w3c.org/TR/NOTE-xml-ql/ (19 Août 1998) Annexe : Grammaire de XML-QL XML-QL ::= (Function | Query) <EOF> Function ::= 'FUNCTION' <FUN-ID> '(' (<VAR>(':' <DTD>)?)* ')' (':' <DTD>)? Query 'END' Query ::= Element ::= StartTag ::= SkolemID ::= Attribute ::= EndTag ::= Literal ::= QueryBlock ::= Where ::= Construct ::= Condition ::= Pattern ::= StartTagPattern ::= RegularExpression ::= Element | Literal | <VAR> | QueryBlock StartTag Query EndTag '<'(<ID>|<VAR>) SkolemID? Attribute* '>' <ID> '(' <VAR> (',' <VAR>)* ')' <ID> '=' ('"' <STRING> '"' | <VAR> ) '<' / <ID>? '>' <STRING> Where Construct ('{' QueryBlock '}')* 'WHERE' Condition (',' Condition)* OrderedBy? 'CONSTRUCT' Query Pattern BindingAs* 'IN' DataSource | Predicate StartTagPattern Pattern* EndTag '<' RegularExpression Attribute* '>' RegularExpression '*' | RegularExpression '+' | RegularExpression '.' RegularExpression | RegularExpression '|' RegularExpression | <VAR> | <ID> BindingAs ::= Predicate ::= Expression ::= OpRel ::= OrderedBy ::= DataSource ::= 'ELEMENT_AS' <VAR> | 'CONTENT_AS' <VAR> Expression OpRel Expression <VAR> | <CONSTANT> '<' | '<=' | '>' | '>=' | '=' | '!=' 'ORDERED-BY' <VAR>+ <VAR> | <URI> | <FUN-ID>(DataSource (',' DataSource)*) DEA IA & OC (Université Paris VIII) Bases de données