27/04/2014© robert godin. tous droits réservés.1 20données semi- structurées et xml
TRANSCRIPT
11/04/23 © Robert Godin. Tous droits réservés. 1
20 Données semi-structurées et XML
11/04/23 © Robert Godin. Tous droits réservés. 2
Pourquoi XML HTML
– Langage de balisage pour la présentation– Balise définit format
XML (eXtensible Markup Language)– Balisage flexible en fonction de l’application– Balise peut servir à spécifier structure et sémantique des données
Facilite l’interprétation des données (par programme ou humain)– Présentation à part (XSL)– Représentation de données semi-structurées
Conformité optionnelle à un schéma– Facilite le traitement informatique et humain
Format normalisé d’échange– couplage faible entre systèmes– SOAP : sérialisation des objets en XML
Schémas– DTD, XML schéma
11/04/23 © Robert Godin. Tous droits réservés. 3
20.1 Introduction à XML<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> <!-- Catalogue de la pépinière Plein de Foin --> <!DOCTYPE Catalogue [ <!ELEMENT Catalogue (Article)+> <!ELEMENT Article (noArticle,description,prixUnitaire)> <!ELEMENT noArticle (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT prixUnitaire (#PCDATA)>]> <Catalogue> <Article> <noArticle>10</noArticle> <description>Cèdre en boule</description> <prixUnitaire>10.99</prixUnitaire> </Article> <Article> <noArticle>20</noArticle> <description>Sapin</description> <prixUnitaire>12.99</prixUnitaire> </Article> … </Catalogue>
<C ata logue>
<A rtic le>
<noA rtic le> <descrip tion> <prixU n ita ire>
10 C èdre en bou le 10,99
<A rtic le>
<noA rtic le> <descrip tion> <prixU n ita ire>
20 S apin 12,99
...
11/04/23 © Robert Godin. Tous droits réservés. 4
Références<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> … <CommandesXML> <ListeCommandes> <Commande> <noCommande>1</noCommande> <dateCommande>01/06/2000</dateCommande> <noClient>10</noClient> <ligneCommande idLigneCommande="idLig1" leIdArticle="idArt1"> <quantite>10</quantite> </ligneCommande> <ligneCommande idLigneCommande="idLig2" leIdArticle="idArt6"> <quantite>5</quantite> </ligneCommande> <ligneCommande idLigneCommande="idLig3" leIdArticle="idArt9"> <quantite>1</quantite> </ligneCommande> </Commande> </ListeCommandes> <Catalogue> <Article idArticle="idArt1" lesIdCommande="idLig1 idLig4"> <noArticle>10</noArticle> <description>Cèdre en boule</description> <prixUnitaire>10.99</prixUnitaire> </Article> … </Catalogue> </CommandesXML>
<C ata logue>
<A rtic le>
<noA rtic le> <descrip tion> <prixU n ita ire>
10 C èdre en bou le 10,99
...
<ListeC om m andes>
<C om m ande>
idA rtic le lesIdC om m ande
idA rt1 idL ig1 idL ig4
<noC om m ande>
1
<dateC om m ande>
01/06/2000
<noC lient>
10
<ligneC om m ande>
idL igneC om m ande
idL ig1
le IdA rtic le
idA rt1
<quantite>
10
...
...
11/04/23 © Robert Godin. Tous droits réservés. 5
Intégrité d’un document XML
Document XML bien formé (well-formed)– entête correcte– un seul élément racine– balises sont correctement imbriquées– éléments non vides doivent avoir une
balise de début et de fin (contrairement à HTML)
Document XML valide– respecte sa grammaire
11/04/23 © Robert Godin. Tous droits réservés. 6
20.2 Espace de nom XML (XML namespace)
<?xml version="1.0"?> <CommandesXML xmlns="http:/ / www.pleindefoin.com/ espaceDeNomCommande" xmlns:catns="http:/ / www.pleindefoin.com/ espaceDeNomCatalogue"> <ListeCommandes> <Commande> <noCommande>1</ noCommande> <dateCommande>01/06/ 2000</ dateCommande> … </ ligneCommande> </ Commande> < catns:Catalogue> <catns:Article idArticle = "idArt1" commandeDans = "idLig1" > <catns:noArticle>10</ catns:noArticle> <catns:description>Cèdre en boule</ catns:description> <catns:prixUnitaire>10.99</ catns:prixUnitaire> </ catns:Article> … </ catns:Catalogue> </ CommandesXML>
11/04/23 © Robert Godin. Tous droits réservés. 7
20.3 XML schema
Limites des DTD– Types de base– Intégration faible de la notion d’espace
de noms– Support faible de clé et d’intégrité
référentielle– Ordre significatif– Le nom d’un élément est global – Syntaxe non conforme à XML
11/04/23 © Robert Godin. Tous droits réservés. 8
Exemple de schéma XML :
http://www.info2.uqam.ca/~godin/XML/schemaCommandesXML.xsd <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:comm="http://www.info.uqam.ca/~godin/XML/schemaCommandesXML" targetNamespace="http://www.info.uqam.ca/~godin/XML/schemaCommandesXML" elementFormDefault="qualified"> <xsd:element name="CommandesXML" type="comm:TypeCommandesXML"/> <xsd:complexType name="TypeCommandesXML"> <xsd:sequence> <xsd:element name="ListeCommandes" type="comm:TypeListeCommandes"/> <xsd:element name="Catalogue" type="comm:TypeCatalogue"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypeListeCommandes"> <xsd:sequence> <xsd:element name="Commande" type="comm:TypeCommande" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypeCommande"> <xsd:sequence> <xsd:element name="noCommande" type="xsd:positiveInteger"/> <xsd:element name="dateCommande" type="xsd:date"/> <xsd:element name="noClient" type="xsd:positiveInteger"/> <xsd:element name="ligneCommande" minOccurs="1" maxOccurs="unbounded"> … </xsd:schema>
11/04/23 © Robert Godin. Tous droits réservés. 9
Exemple d’instance du schéma :http://www.info2.uqam.ca/~godin/XML/CommandesAvecSchema.xml
<?xml version="1.0"?> <CommandesXML xmlns="http://www.info.uqam.ca/~godin/XML/schemaCommandesXML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.info.uqam.ca/~godin/XML/schemaCommandesXML http://www.info.uqam.ca/~godin/XML/schemaCommandesXML.xsd"> <ListeCommandes> <Commande> <noCommande>1</noCommande> <dateCommande>2000-06-01</dateCommande> <noClient>10</noClient> <ligneCommande idLigneCommande="idLig1" leIdArticle="idArt1"> <quantite>10</quantite> </ligneCommande> <ligneCommande idLigneCommande="idLig2" leIdArticle="idArt6"> <quantite>5</quantite> </ligneCommande> <ligneCommande idLigneCommande="idLig3" leIdArticle="idArt9"> <quantite>1</quantite> </ligneCommande> </Commande> … </CommandesXML>
11/04/23 © Robert Godin. Tous droits réservés. 10
20.4 Langage de requête XPath
<ListeC om m andes>
<C om m ande>
...
<C om m andesXM L>
/CommandesXML/ListeCommandes/Commande[1]
/child::CommandesXML/child::ListeCommandes/child::Commande[position()=1]
11/04/23 © Robert Godin. Tous droits réservés. 11
20.5 XPointer
<link xmlns:xlink="http://www.w3.org/2000/xlink" xlink:type="simple" xlink:href="http://www.info.uqam.ca/~godin/XML/CommandesAvecSchema.xml#xpointer(//Commande[1])"> </link>
11/04/23 © Robert Godin. Tous droits réservés. 12
20.6 Contraintes de clé
<?xml version="1.0"?> <!-- Exemple de schéma avec contraintes de clé --> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:comm="http://www.info.uqam.ca/~godin/XML/schemaCommandesAvecKey" targetNamespace="http://www.info.uqam.ca/~godin/XML/schemaCommandesAvecKey" elementFormDefault="qualified"> <xsd:element name="CommandesXML" type="comm:TypeCommandesXML"> <xsd:key name="CPpourCatalogue"> <xsd:selector xpath="Catalogue/Article"/> <xsd:field xpath="noArticle"/> </xsd:key> <xsd:keyref name="CEnoArticleDansLigneCommande" refer="comm:CPpourCatalogue"> <xsd:selector xpath="ListeCommandes/Commande/ligneCommande"/> <xsd:field xpath="noArticle"/> </xsd:keyref> </xsd:element> … </xsd:schema>
11/04/23 © Robert Godin. Tous droits réservés. 13
Exemple d’instance valide<?xml version="1.0"?> <CommandesXML xmlns="http://www.info.uqam.ca/~godin/XML/schemaCommandesAvecKey" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.info.uqam.ca/~godin/XML/schemaCommandesAvecKey http://www.info.uqam.ca/~godin/XML/schemaCommandesAvecKey.xsd"> <ListeCommandes> <Commande> <noCommande>1</noCommande> <dateCommande>2000-06-01</dateCommande> <noClient>10</noClient> <ligneCommande> <noArticle>10</noArticle> <quantite>10</quantite> </ligneCommande> … <Catalogue> <Article> <noArticle>10</noArticle> <description>Cèdre en boule</description> <prixUnitaire>10.99</prixUnitaire> </Article> … </CommandesXML>
11/04/23 © Robert Godin. Tous droits réservés. 14
20.7 Langage de requête XML Query (XQuery) Contient XPath Input : ensemble de documents
XML Sources diverses Peut produire du XML en sortie
Expressions XQuery
Expression primaire– litéral, variable, fonction
Séquence– « , » est le constructeur
Expression XPath Expression FLWOR
– FOR, LET, WHERE, ORDER BY, RETURN Expression conditionnelle, arithmétique,
relationnelle, régulière, quantifiée, …
11/04/23 © Robert Godin. Tous droits réservés. 15
11/04/23 © Robert Godin. Tous droits réservés. 16
20.8 Traitement d’un document XML avec Java
API for XML Processing (JAXP)http://java.sun.com/xml/jaxp/index.jsp
Interface Document Object Model (DOM)– instance XML -> arbre de Node Java DocumentBuilderFactory unDocBuildFact = DocumentBuilderFactory.newInstance();
unDocBuildFact.setValidating(true); unDocBuildFact.setIgnoringElementContentWhitespace(true); / / Création d'un DocumentBuilder DocumentBuilder unDocumentBuilder = unDocBuildFact.newDocumentBuilder(); / / Parsage du document Document unDocument = unDocumentBuilder.parse("C:/ forte4j/ Development/ LivreJava/ Articles.xml"); Vector vecteurDeArticles = new Vector(); Node unElementCatalogue = unDocument.getDocumentElement(); / / racine <Catalogue> / / Itérer sur les noeuds <Article> qui sont les enfants de <Catalogue> NodeList listeNodeArticles = unElementCatalogue.getChildNodes(); int tailleListe = listeNodeArticles.getLength(); for (int i = 0; i < tailleListe ; i++) { Node unNodeArticle = listeNodeArticles.item(i); / / ELEMENT <Article>
11/04/23 © Robert Godin. Tous droits réservés. 17
Java Architecture for XML Binding (JAXB) http://java.sun.com/xml/jaxb/ Schéma XML -> classes métier
Java– Java binding compiler
Instance XML -> objets métier Java
11/04/23 © Robert Godin. Tous droits réservés. 18
20.9 Système de Gestion de XML Application centrée donnée
– XML = format d’échange avec BD Application centrée document
– XML stocké dans SGXML SGXML natif
– Modèle BD = XML Extension SGBD
– Au dessus du modèle relationnel
11/04/23 © Robert Godin. Tous droits réservés. 19
20.10 Oracle et XML : Oracle XML DB Application centrée données
– Mécanismes de transformation SQL<->XML– XML SQL Utility (XSU) : API Java/JDBC– SQL/XML– Type XMLType avec stockage objet-relationnel
Conversion selon annotations du schéma XML
Application centrée documents (SGXML)– XMLType avec conformité facultative à un schéma XML – Stockage CLOB ou binaire (11g, après parsage) ou hybride
Requêtes sur XMLType– Fonctions SQL pour XPath et XQuery
XML DB repository– Vue des documents sous forme de répertoire hiérarchique
Accès HTTP, FTP, WebDAV APIs Java/JDBC, PL/SQL, .NET/C#
11/04/23 © Robert Godin. Tous droits réservés. 20
XML SQL Utility (XSU) : exemple de transformation SQL->XMLimport java.sql.*; import java.math.*; import oracle.xml.sql.query.*; import oracle.jdbc.*; import oracle.jdbc.driver.*; public class ExempleSelectEnXML { public static void main(String args[]) throws Exception { UsineConnection uneUsineConnection = new UsineConnection(); Connection uneConnection = uneUsineConnection.getConnectionSansAutoCommit( "oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:ora9i", "godin","oracle"); // Création de la requête OracleXMLQuery OracleXMLQuery unOracleXMLQuery = new OracleXMLQuery(uneConnection,"SELECT * FROM Article" ); // Paramétrage du XML document unOracleXMLQuery.setRowsetTag("Catalogue"); // Spécifie la balise racine unOracleXMLQuery.setRowTag("Article"); // Balise pour chacune des lignes // Extraction du document XML sous forme de String String stringXML = unOracleXMLQuery.getXMLString(); System.out.println(" Document XML:\n"+stringXML); } }
11/04/23 © Robert Godin. Tous droits réservés. 21
Fonctions SQL/XML (SQLX) de génération de XML
SQL> SELECT XMLELEMENT("Article", 2 XMLELEMENT("noArticle", a.noArticle), 3 XMLELEMENT("description", a.description), 4 XMLELEMENT("prixUnitaire", a.prixUnitaire)) AS "Catalogue" 5 FROM Article a 6 / Catalogue -------------------------------------------------------------------------------- <Article> <noArticle>10</noArticle> <description>Cèdre en boule</description> <prixUnitaire>10,99</prixUnitaire> </Article> <Article> <noArticle>20</noArticle> <description>Sapin</description> <prixUnitaire>12,99</prixUnitaire> </Article> …
11/04/23 © Robert Godin. Tous droits réservés. 22
Fonctions SGXMLSQL> CREATE TABLE CommandesXML OF XMLType 2 / Table created.
SQL> INSERT INTO CommandesXML VALUES (XMLType(' 2 <Commande> 3 <noCommande>1</noCommande> 4 <dateCommande>2000-06-01</dateCommande> 5 <noClient>10</noClient> 6 <ligneCommande> 7 <noArticle>10</noArticle> 8 <quantite>10</quantite> 9 </ligneCommande> 10 <ligneCommande> 11 <noArticle>70</noArticle> 12 <quantite>5</quantite> 13 </ligneCommande> 14 <ligneCommande> 15 <noArticle>90</noArticle> 16 <quantite>1</quantite> 17 </ligneCommande> 18 </Commande> 19 ')) 20 / 1 row created.
Stockage natif CLOB par défaut
- requêtes traitées par conversion DOM à la volée
11/04/23 © Robert Godin. Tous droits réservés. 23
Requête XPath sur XMLType avec extractValue()
Instance XMLType Expression XPath
Fonction qui retourne la valeur de l’élément XML sélectionné (conversion en scalaire SQL)
SQL> SELECT extractValue(value(C),'/Commande/noCommande') 2 FROM CommandesXML C 3 WHERE extractValue(value(C),'/Commande/noClient') = 10 4 / EXTRACTVALUE(VALUE(C),'/COMMANDE/NOCOMMANDE')--------------------------------------------------------------------------------15
Fonction extract()
11/04/23 © Robert Godin. Tous droits réservés. 24
SQL> SELECT extract(value(C),'/Commande/noCommande/text()') 2 FROM CommandesXML C 3 WHERE extract(value(C),'/Commande/noClient/text()').getnumberval() = 10 4 / EXTRACT(VALUE(C),'/COMMANDE/NOCOMMANDE/TEXT()')--------------------------------------------------------------------------------15
Fonction existsNode()
11/04/23 © Robert Godin. Tous droits réservés. 25
SQL> SELECT extract(value(C),'/Commande/noCommande/text()') 2 FROM CommandesXML C 3 WHERE existsNode(value(C),'/Commande[noClient="10"]') = 1 4 / EXTRACT(VALUE(C),'/COMMANDE/NOCOMMANDE/TEXT()')--------------------------------------------------------------------------------15 SQL> SELECT extract(value(C),'/Commande/noCommande') 2 FROM CommandesXML C 3 WHERE existsNode(value(C),'/Commande[noClient="10"]') = 1 4 / EXTRACT(VALUE(C),'/COMMANDE/NOCOMMANDE')--------------------------------------------------------------------------------<noCommande>1</noCommande><noCommande>5</noCommande>
Fonction SQL/XML : XMLQuery
11/04/23 © Robert Godin. Tous droits réservés. 26
SQL> SELECT XMLQuery('(1,2+3,"ABC",<tag>blabla</tag>)' RETURNING CONTENT) AS Output FROM DUAL 2 /
OUTPUT--------------------------------------------------------------------------------1 5 ABC<tag>blabla</tag>
Séquence XQuery
Requête FLWOR
11/04/23 © Robert Godin. Tous droits réservés. 27
SQL> SELECT XMLQuery( 2 'for $c in /Commande 3 where $c/noClient = "10" 4 return $c/noCommande' 5 PASSING OBJECT_VALUE RETURNING CONTENT) AS Output 6 FROM CommandesXML 7 /
OUTPUT--------------------------------------------------------------------------------<noCommande>1</noCommande><noCommande>5</noCommande>
Contexte de la requête est la valeur de l’objet XMLType de la table d’objets
La variable $c itère sur chacun des éléments spécifiés par le chemin (ici un seul élément Commande)
Itération sur les éléments ligneCommande
11/04/23 © Robert Godin. Tous droits réservés. 28
SQL> SELECT XMLQuery( 2 'for $l in /Commande/ligneCommande 3 where $l/noArticle > 20 4 return $l/noArticle' 5 PASSING OBJECT_VALUE RETURNING CONTENT) 6 FROM CommandesXML 7 /
XMLQUERY('FOR$LIN/COMMANDE/LIGNECOMMANDEWHERE$L/NOARTICLE>20RETURN$L/NOARTICLE'P--------------------------------------------------------------------------------<noArticle>70</noArticle><noArticle>90</noArticle><noArticle>70</noArticle>
Construction explicite de XML en output
11/04/23 © Robert Godin. Tous droits réservés. 29
SQL> SELECT XMLQuery( 2 'for $l in /Commande/ligneCommande 3 where $l/noArticle > 20 4 return <numeroArticle>{$l/noArticle/text()}</numeroArticle>' 5 PASSING OBJECT_VALUE RETURNING CONTENT) 6 FROM CommandesXML 7 /
XMLQUERY('FOR$LIN/COMMANDE/LIGNECOMMANDEWHERE$L/NOARTICLE>20RETURN<NUMEROARTICLE--------------------------------------------------------------------------------<numeroArticle>70</numeroArticle><numeroArticle>90</numeroArticle><numeroArticle>70</numeroArticle>
{} demande l’évaluation
Où est l’erreur ?
11/04/23 © Robert Godin. Tous droits réservés. 30
SQL> SELECT XMLQuery( 2 'for $c in /Commande 3 where $c/ligneCommande/noArticle > 20 4 return $c/ligneCommande/noArticle' 5 PASSING OBJECT_VALUE RETURNING CONTENT) 6 FROM CommandesXML 7 /
XMLQUERY('FOR$CIN/COMMANDEWHERE$C/LIGNECOMMANDE/NOARTICLE>20RETURN$C/LIGNECOMMAN--------------------------------------------------------------------------------<noArticle>10</noArticle><noArticle>70</noArticle><noArticle>90</noArticle><noArticle>10</noArticle><noArticle>70</noArticle><noArticle>20</noArticle>
11/04/23 © Robert Godin. Tous droits réservés. 31
Indexage avec stockage CLOB ou binaire Plusieurs types d’index supportés Indexage sur chemin XPath particulier
– create unique index IndexNoCommande on CommandesXML (extractValue(object_value,'/Commande/NoCommande'))
– la balise doit être unique dans le document Indexage systématique de tous les chemins
– create index IndexCommandesXML on CommandesXML (object_value) indextype is CTXSYS.CTXXPATH
– réécriture en HASPATH/INPATH (voir indexage Context au chap.21)
– plus coûteux que sur fonction XPath Indexage plein texte des valeurs textuelles
(voir chap. 21) 11g : XMLIndex remplace CTXXPATH
11/04/23 © Robert Godin. Tous droits réservés. 32
Support de schéma XMLSQL> DECLARE 2 schemaXML varchar2(5000) := 3 '<?xml version="1.0"?> 4 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:comm="http://www.info.uqam.ca/~g odin/XML/schemaCommandesXML" targetNamespace="http://www.info.uqam.ca/~godin/XML/schemaCommandesXML" elementFormDefault="qualified"> 5 <xsd:element name="CommandesXML" type="comm:TypeCommandesXML"/> 6 … 94 </xsd:schema>'; 95 BEGIN 96 dbms_xmlschema.registerSchema('http://www.info.uqam.ca/~godin/XML/schemaCommandesXML.xsd', schemaXML); 97 END; 98 / PL/SQL procedure successfully completed. SQL> CREATE TABLE CommandesAvecSchema OF XMLTYPE 2 XMLSCHEMA "http://www.info.uqam.ca/~godin/XML/schemaCommandesXML.xsd" ELEMENT "CommandesXML"; Table created.
11/04/23 © Robert Godin. Tous droits réservés. 33
Stockage objet-relationnel
Annotations XML pour stockage objet-relationnel
Vue XMLType sur stockage objet-relationnel
Attributs xdb:SQLName, xdb:SQLType dans le schéma XML
Réécriture des requêtes XPath par l’optimiseur– Exploitation de l’optimiseur relationnel
BD de documents
Modèle (clé, document) API de base
– Put(clé, document), Get(clé), Update(clé), Delete(clé) Document semi-structuré
– Sans schéma– Attribut : valeur, XML, JSON, …
Requêtes simples sur le contenu Support d’index Scalabilité élastique Transactions limitées CouchDB, MongoDB, Simple DB, …
11/04/23 © Robert Godin. Tous droits réservés. 34