Master d Informatique Corrigé du partiel novembre 2010



Documents pareils
Programmation des Applications Réparties. Parsers XML DOM et SAX

PIVOT. Pivot/Querier Documentation technique XML/XSD/XSLT

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

<?xml version="1.0" encoding="iso " standalone="yes"?>

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Corrigé des exercices sur les références

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

L'API DOM : Document Object Model

Projet de programmation (IK3) : TP n 1 Correction

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Corrigés des premiers exercices sur les classes

Solutions du chapitre 4

Préparation d'un fichier XML pour le reporting des activités avec l'étranger concernant les services, les transferts et les marchandises. Ed.

Chapitre IX. L intégration de données. Les entrepôts de données (Data Warehouses) Motivation. Le problème

Programmer en JAVA. par Tama

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

BD et XML : Exercices

Thierry BOULANGER. par la pratique. Bases indispensables Concepts et cas pratiques XML. 3 ième édition. Nouvelle édition

TD/TP PAC - Programmation n 3

Design et implémentation d un logiciel de validation et de génération de configurations réseaux

Introduction : les processus. Introduction : les threads. Plan

Web Application Models

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Production de documents avec XSLT. Production de documents p.1/??

Gestion Électronique de Documents et XML. Master 2 TSM

TD/TP PAC - Programmation n 3

XML avec Oracle. Par Christian Soutou. Maître de conférences, IUT de Blagnac, Université de Toulouse Le Mirail

Programmation avec des objets : Cours 7. Menu du jour

Chapitre 10. Les interfaces Comparable et Comparator 1

TP1 : Initiation à Java et Eclipse

TD3: tableaux avancées, première classe et chaînes

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

as Architecture des Systèmes d Information

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation Web. Madalina Croitoru IUT Montpellier

BASE DE DONNÉES XML NATIVE

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Qu'est-ce que XML? XML : Extensible Markup Language. Exemple de document SGML SGML

Utilisation d objets : String et ArrayList

HTML. Notions générales

Plateforme PAYZEN. Définition de Web-services

Java Licence Professionnelle CISII,

XML et Java Vue Balisée en XML. Programmation avancée NFP 121. XML pourquoi faire? Structuration des données. Titre Auteur Section Paragraphe

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Bases Java - Eclipse / Netbeans

La base de données XML exist. A. Belaïd

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

TP JAVASCRIPT OMI4 TP5 SRC

Présentation du langage et premières fonctions

Tp 1 correction. Structures de données (IF2)

Programmation Orientée Objet Java

Programme Compte bancaire (code)

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Document Object Model (DOM)

TP1. Outils Java Eléments de correction

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Plan du cours. Historique du langage Nouveautés de Java 7

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Les architectures 3-tiers Partie I : les applications WEB

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Développement Web - Object Relational Mapping and Hibernate

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Documentation CAS à destination des éditeurs

Faculté Polytechnique de Mons. Le processus d Extraction, Transformation et Load (ETL) dans des entrepôts de données XML

Un ordonnanceur stupide

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

DOM - Document Object Model

Aspects techniques : guide d interfaçage SSO

L architecture des services Web

Accès à l'information XML par des requêtes XQuery au travers de son XSchema

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

.. CSS. Damien Nouvel. Damien Nouvel (Inalco) CSS 1 / 15

Gestion distribuée (par sockets) de banque en Java

2. Comprendre les définitions de classes

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

Les structures de données. Rajae El Ouazzani

1 INTRODUCTION ET OBJECTIFS GÉNÉRATION DE PDF AVEC.NET LES SOLUTIONS DE BI AVEC.NET...13

Server-side XML. PAS FINI... mais ok pour un début. Originaux. Auteurs et version. Prérequis: Java de base, servlets, GUI et XML

Structurer ses données : les tableaux. Introduction à la programmation

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Programmation par les Objets en Java

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

TP, première séquence d exercices.

Programmation Orientée Objet

Application de lecture de carte SESAM-Vitale Jeebop

Programmation en Java IUT GEII (MC-II1) 1

BIRT (Business Intelligence and Reporting Tools)

Initiation à html et à la création d'un site web

Serveur d'archivage 2007 Installation et utilisation de la BD exist

RAPPORT AUDIT SEO. Élaboré à l'attention de : Monsieur Greber Élaboré par : Cédric Peinado

Définition des Webservices Ordre de paiement par . Version 1.0

Recherche dans un tableau

Transcription:

Universités d Aix-Marseille I & II Technologies XML Master d Informatique Corrigé du partiel novembre 2010 Année 2010-11 Documents autorisés Exercice 1 : Documents XML et Applications XML (4 points) Georges, un jeune propriétaire un poil maniaque, gère son compte bancaire via un fichier XML. Il écrit chaque mois un fichier XML correspondant à ses opérations du mois. Ce fichier commence par le montant initial du solde de son compte puis viennent toutes les opérations effectuées sur le compte (débit et dépôt). Un exemple représentatif décrivant (une partie) des données est donné dans le document 1 page 10. Il correspond au relevé de compte annoté présenté dans le document 2 page 11. 1. En respectant la structure du document 1, écrivez le fichier XML correspondant au relevé de compte présenté ci-dessous. Juillet 2010 Solde initial 131.40 Chèque de SNCM 1344.88 3-7-10 salaire salaire de Juin Carte, SNCF -88.00 6-7-10 vacances billets de train Perpignan Carte, DAB -40.00 10-7-10 liquide argent de poche Chèque n 1003, Les flots bleus - 90.45 17-7-10 vacances camping Perpignan Chèque n 1005, Bernard Merle - 987.32 20-7-10 loyer loyer de juillet <?xml version="1.0" encoding="iso-8859-1"?> <livre-de-comptes> <valeur-initiale>131.40</valeur-initiale> <depot type="cheque"> <payeur>sncm</payeur> <montant>1344.88</montant> <date>3-7-10</date> <description categorie="salaire">salaire de Juin</description> </depot> <retrait type="debit"> <destinataire>sncf</destinataire> <montant>88.00</montant> <date>6-7-10</date> <description categorie="vacances">billets de train Perpignan</description> <retrait type="distributeur"> <montant>40.00</montant> <date>10-7-10</date> 1

<description categorie="liquide">argent de poche</description> <retrait type="cheque" numero="1003"> <destinataire>les flots bleus</destinataire> <montant>90.45</montant> <date>17-7-10</date> <description categorie="vacances">camping Perpignan</description> <retrait type="cheque" numero="1005"> <payeur>bernard Merle</payeur> <montant>987.32</montant> <date>20-7-10</date> <description categorie="loyer">loyer de Juillet</description> </livre-de-comptes> 2. Donnez une DTD correspondant aux documents XML ainsi produits. <!ELEMENT livre-de-compte (valeur-initiale,(depot retrait)*)> <!ELEMENT valeur-initiale (#PCDATA)> <!ELEMENT depot (payeur,montant,date,description)> <!ATTLIST depot type CDATA #REQUIRED> <!ELEMENT retrait (destinataire?,montant,date,description)> <!ATTLIST retrait type CDATA #REQUIRED numero CDATA #IMPLIED> <!ELEMENT payeur (#PCDATA)> <!ELEMENT destinataire (#PCDATA)> <!ELEMENT montant (#PCDATA)> <!ELEMENT date (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ATTLIST description categorie CDATA #REQUIRED> 3. Donnez un schéma XML correspondant aux documents XML ainsi produits. <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> <xsd:element name="livre-de-compte"> <xsd:complextype> <xsd:sequence> <xsd:element name="valeur-initiale" type="xsd:string"/> 2

<xsd:choice minoccurs="0" maxoccurs="unbounded"> <xsd:element ref="depot"/> <xsd:element ref="retrait"/> </xsd:choice> </xsd:sequence> </xsd:complextype> </xsd:element> <xsd:element name="depot"> <xsd:complextype> <xsd:sequence> <xsd:element ref="payeur"/> <xsd:element ref="montant"/> <xsd:element ref="date"/> <xsd:element ref="description"/> </xsd:sequence> <xsd:attribute name="type" type="xsd:string" use="required"/> </xsd:complextype> </xsd:element> <xsd:element name="retrait"> <xsd:complextype> <xsd:sequence> <xsd:element ref="destinataire" minoccurs="0"/> <xsd:element ref="montant"/> <xsd:element ref="date"/> <xsd:element ref="description"/> </xsd:sequence> <xsd:attribute name="type" type="xsd:string" use="required"/> <xsd:attribute name="numero" type="xsd:positiveinteger" use="optional"/> </xsd:complextype> </xsd:element> <xsd:element name="payeur" type="xsd:string"/> <xsd:element name="destinataire" type="xsd:string"/> <xsd:element name="montant" type="xsd:decimal"/> <xsd:element name="date" type="xsd:date"/> <xsd:element name="description" type="xsd:string"> <xsd:complextype> <xsd:attribute name="categorie" type="xsd:string" use="required"/> </xsd:complextype> </xsd:element> </xsd:schema> 3

Exercice 2 : API Java SAX et DOM (5 points) Georges, notre jeune propriétaire de l exercice 1 souhaite maintenant profiter de la puissance d XML pour gérer son compte facilement. Remarque : Si des fonctions ou des procédures de votre code sont strictement identiques aux éléments correspondants des programme Java vus en TP, vous pouvez vous contenter d y faire référence sans tout recopier. 1. Ecrire un programme Java utilisant l API SAX qui, à partir d un fichier d entrée Livre de compte.xml (voir document 1 page 10), affiche les montants et dates des retraits de type distributeur. Nous allons ajouter dans la classe des variables permettant d indiquer si l élément que nous sommes en train de parcourir est ou non un retrait au distributeur. On obtient les modifications suivantes : private boolean print; private boolean save_montant; private boolean save_date; private String montant; private String date; public SimpleSaxParser () { super(); this.print=false; this.save_montant=false; this.save_date=false; this.montant=""; this.date=""; public void startelement(string namespaceuri, String localname, // local name String rawname, // qualified name Attributes atts) throws SAXException { String eltname = localname; if ("".equals(eltname)) eltname = rawname; // namespaceaware = false if ("retrait".equals(eltname)){ for (int i=0; i <atts.getlength(); i++) { String attname = atts.getqname(i); if ("".equals(attname)) attname = atts.getqname(i); if ("type".equals(attname) && "distributeur".equals(atts.getvalue(i))) { print = true; 4

else if ("montant".equals(eltname) && print) { save_montant = true; else if ("date".equals(eltname) && print) { save_date = true; public void characters (char[] ch, int start, int length) { String text = new String (ch, start, length); if (save_montant) montant = text; if (save_date) date = text; public void endelement(java.lang.string uri, java.lang.string localname, java.lang.string rawname) throws SAXException { String eltname = localname; if ("".equals(eltname)) eltname = rawname; if ("retrait".equals(eltname) && print) { System.out.print("Retrait de "+montant+" effectue le "+date+"\n"); print = false; else if ("montant".equals(eltname)) { save_montant = false; else if ("date".equals(eltname)) { save_date = false; 2. Ecrire un programme Java utilisant l API DOM qui, à partir d un fichier d entrée Livre de compte.xml, génère un nouveau fichier XML Livre de compte-update.xml dont la valeur initiale est le nouveau solde (donc la valeur initiale précédente plus les dépôts, moins les retraits). Ce nouveau fichier ne contient pas d opération bancaire. Nous effectuons d abord un arbre DOM du document, puis nous le parcourons pour calculer la nouvelle valeur. Enfin, nous construisons un nouveau document contenant seulement l élément avec la nouvelle valeur, et nous renvoyons ce document. Nous présentons ci-dessous les définitions correspondant au calcul du nouveau montant en DOM. 5

public static float explore(node domnode, boolean mode) { int type = domnode.getnodetype(); String nodename = domnode.getnodename(); float montant = 0; // Cas d un element if (type == 1) { // Cas de valeur-initiale if ("valeur-initiale".equals(nodename)) { NodeList child = domnode.getchildnodes(); for (int i = 0; i < child.getlength(); i++) montant+=explore(child.item(i), true); // Cas de depot else if ("depot".equals(nodename)) { NodeList child = domnode.getchildnodes(); for (int i = 0; i < child.getlength(); i++) montant+=explore(child.item(i), false); // Cas de retrait else if ("retrait".equals(nodename)) { NodeList child = domnode.getchildnodes(); for (int i = 0; i < child.getlength(); i++) montant-=explore(child.item(i), false); // Cas de montant else if ("montant".equals(nodename)) { NodeList child = domnode.getchildnodes(); for (int i = 0; i < child.getlength(); i++) montant=explore(child.item(i), true); // Autres elements else { NodeList child = domnode.getchildnodes(); for (int i = 0; i < child.getlength(); i++) montant+=explore(child.item(i),mode); // Cas d un texte else if (type == 3) { if (mode) { String text = domnode.getnodevalue().trim(); float f = Float.valueOf(text).floatValue(); 6

montant = f; else { NodeList child = domnode.getchildnodes(); for (int i = 0; i < child.getlength(); i++) montant+=explore(child.item(i),mode); return montant; Exercice 3 : Requêtes XPath (5 points) On considère les stocks d un magasin d articles pour la maison. Les informations associées à un produit sont les suivantes : nom nom du fournisseur prix d achat prix de vente nombre d unités restantes nombre d articles vendus au cours du mois dernier Un exemple de document XML représentant trois articles est donné dans le document 3 page 11. Les requêtes que vous écrirez par la suite doivent naturellement être valables pour n importe quel document XML suivant la même spécification. Donnez des requêtes XPath pour sélectionner les éléments suivants. Vous écrirez des requêtes purement descendantes lorsque cela est possible. (a) les articles dont le prix de vente est inférieur à 10 euros. /shop/article[@prix vente<=10] (b) les éléments nom des articles fournis par l établissement meubles morel. /shop/article[fournisseur= meubles morel ]/nom (c) les éléments fournisseur des produits dont le nombre restant en stock est inférieur à ce qui a été vendu le mois dernier. /shop/article[qtity<nb ventes]/fournisseur (d) les éléments nom des articles pour lesquels la marge est inférieure à 20% (la marge est définie comme le rapport (prix de vente - prix d achat)/prix de vente). /shop/article[@prix achat >= 0.8*@prix vente]/nom 7

(e) deux requêtes permettant respectivement de calculer le chiffre d affaire du mois dernier (somme de toutes les ventes), et le bénéfice du mois dernier. sum(/shop/article/nb ventes) donne le nombre total de ventes /shop/article[nom="table basse"]/nb ventes/text()*/shop/article[nom="table basse"]/@prix vente donne le chiffre d affaire pour le produit table basse Il n était en fait pas possible d obtenir le chiffre d affaire global. Exercice 4 : Transformations XSLT (6 points) On utilise un modèle plus détaillé de stock intégrant une description du magasin (nom, adresse) et des descriptions des produits accompagnées d une image. Le document 4 page 12 donne un exemple de document XML obtenu pour ce type de représentation. Dans la suite, vous n avez pas besoin de préciser les références xmlns complètes. Affichage XSL (4 points) 1. Proposez une feuille de style XSL permettant un affichage (X)HTML du catalogue du magasin à destination des clients. Cette page donnera d abord le nom du magasin avec son adresse puis, pour chaque produit, sa description, son illustration, son prix de vente, et enfin affichera le nombre d éléments en stock. (Balise <img src= /> pour insérer une image en html) 2. Modifiez votre feuille de style pour que le contenu de la page soit sensible au nombre d éléments en stock : Produit indisponible si le stock est vide, Attention, plus que x éléments en stock s il reste 0 < x 5 éléments en stock, (la valeur de x doit être insérée dans le message) Produit disponible sinon. <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <!-- Ainsi le context initial est l élément shop--> <xsl:template match="/shop"> <html> <head> <title>catalogue du magasin</title> </head> <body> <p> <xsl:value-of select="boutique/nom"/> <text>, situé au </text> <xsl:value-of select="boutique/adresse"/> 8

</p> <p> <ul><xsl:apply-templates select="article"/></ul> </p> </body> </html> </xsl:template> <xsl:template match="article"> <li> <xsl:value-of select="nom"/> : <xsl:value-of select="description"/>. <img src="{image"/> Vendu au tarif de <xsl:value-of select="@prix_vente"/> euros. <xsl:if test="qtity= 0 "> Produit indisponible </xsl:if> <xsl:if test="qtity>0 and qtity<6"> Attention, plus que <xsl:value-of select="qtity"/> produits en stock </xsl:if> <xsl:if test="qtity>5"> Produit disponible </xsl:if> </li> </xsl:template> </xsl:stylesheet> Mise en forme (2 points) On considère une entreprise mère qui possède plusieurs filiales. Chaque filiale envoyant ses chiffres du mois sous la forme d un document XML (selon le format simple), on souhaite créer une feuille de style XSL permettant de regrouper ces documents. Les filiales vendant certains produits en commun, il faut alors regrouper les chiffres. On supposera que l on peut identifier un produit par son nom, et qu alors il a les mêmes prix d achat, prix de vente, fournisseurs dans toutes les filiales. L entrée correspondant à ce produit dans le document produit doit donc indiquer le nombre total de produits en stock, et le nombre total de ventes. On consière un document maître qui recense les documents produits par les filiales: <liste> <item> <nom>mille Merveilles</nom> <path>mm.xml</path> </item> <item> <nom>paris Direct</nom> <path>paris.xml</path> 9

</item> <item> <nom>origine Marseille</nom> <path>om.xml</path> </item> </liste> Ecrivez une feuille de style applicable à ce document maître et permettant de construire un nouveau document XML respectant le format simple de présentation des produits correspondant aux chiffres obtenus pour l entreprise toute entière. Indication : Vous pouvez utiliser en XSLT l opérateur XPath fn:distinct-values qui s applique à une liste de noeuds texte et qui permet de filtrer les doublons. La solution complète est un peu longue, je ne la donne pas ici... Annexes Document 1 : Livre de compte <?xml version="1.0" encoding="iso-8859-1"?> <livre-de-comptes> <valeur-initiale>22.00</valeur-initiale> <depot type="cheque"> <payeur>sncm</payeur> <montant>1344.88</montant> <date>3-6-10</date> <description categorie="salaire">salaire de Mai</description> </depot> <retrait type="cheque" numero="980"> <destinataire>sac à pof</destinataire> <montant>132.77</montant> <date>17-6-10</date> <description categorie="loisirs">equipement d escalade</description> <retrait type="cheque" numero="978"> <payeur>bernard Merle</payeur> <montant>987.32</montant> <date>21-6-10</date> <description categorie="loyer">loyer de Juin</description> <retrait type="distributeur"> <montant>40.00</montant> <date>24-6-10</date> <description categorie="liquide">argent de poche</description> 10

<retrait type="debit"> <destinataire>pizzeria Florence</destinataire> <montant>36.86</montant> <date>26-6-10</date> <description categorie="repas">restau avec Greg</description> <depot type="direct"> <payeur>assurance maladie</payeur> <montant>137.32</montant> <date>21-7-10</date> <description categorie="remboursement">tamiflu</description> </depot> </livre-de-comptes> Document 2 : Relevé de compte Juin 2010 Solde initial 22.00 Chèque de SNCM 1344.88 3-6-10 salaire salaire de Mai Chèque n 980, Sac à pof - 132.77 17-6-10 loisirs equipement d escalade Chèque n 978, Bernard Merle - 987.32 21-6-10 loyer loyer de juin Carte, DAB -40.00 24-6-10 liquide argent de poche Carte, Pizzeria Florence -36.86 26-6-10 repas restau avec Greg Depot, Assurance maladie 137.32 29-6-10 remboursement Tamiflu Document 3 : Exemple de stock simplifié <shop> <article prix_achat="150" prix_vente="225"> <nom>table basse</nom> <fournisseur>meubles morel</fournisseur> <qtity>15</qtity> <nb_ventes>3</nb_ventes> </article> <article prix_achat="3.5" prix_vente="8"> <nom>bougie fleurs</nom> <fournisseur>tpc</fournisseur> <qtity>133</qtity> <nb_ventes>43</nb_ventes> </article> <article prix_achat="40" prix_vente="49.9"> <nom>tabouret bar</nom> 11

<fournisseur>artisans et Cie</fournisseur> <qtity>2</qtity> <nb_ventes>10</nb_ventes> </article> </shop> Document 4 : Exemple de stock avec descriptions <shop> <boutique> <nom>la maison pour tous</nom> <adresse>6, rue Saint Férréol, 13006 Marseille</adresse> </boutique> <article prix_achat="150" prix_vente="225"> <nom>table basse</nom> <fournisseur>meubles morel</fournisseur> <description>réalisée en ch^ene massif, cette table ornera à merveille votre salon de style ancien. Disponible dans différents coloris, elle vous sera livrée gratuitement en 48 heures. </description> <image>data/images/capture332.jpg</image> <qtity>15</qtity> <nb_ventes>3</nb_ventes> </article> <article prix_achat="3.5" prix_vente="8"> <nom>bougie fleurs</nom> <fournisseur>tpc</fournisseur> <description>bougie en cire végétale. Produit entièrement naturel......et s intègre dans les autres accessoires de cette collection. </description> <image>data/images/capture007.jpg</image> <qtity>133</qtity> <nb_ventes>43</nb_ventes> </article> </shop> 12