140 likes | 230 Vues
Projet de semestre. Responsable :. Prof. Claude Petitpierre. Superviseur :. Duy Vo Duc. Exemple pratique. Fichier XML des collaborateurs Liste des personnes Prime de 10% Plusieurs fichiers à traiter Rapidité de développement. <Personnes> <Personne Salaire=" 4000 ">
E N D
Projet de semestre Responsable : Prof. Claude Petitpierre Superviseur : Duy Vo Duc
Exemple pratique • Fichier XML des collaborateurs • Liste des personnes • Prime de 10% • Plusieurs fichiers à traiter • Rapidité de développement <Personnes> <Personne Salaire="4000"> <Prénom>Julie</Prénom> <Nom>Blanc</Nom> </Personne> <Personne Salaire="3200"> <Prénom>Jean</Prénom> <Nom>Toufou</Nom> </Personne> <Personne Salaire="6500"> <Prénom>Sophie</Prénom> <Nom>Nalup</Nom> </Personne> <Personne Salaire="7000"> <Prénom>Claire-Lise</Prénom> <Nom>De Reck</Nom> </Personne> <Personne Salaire="6800"> <Prénom>Philippe</Prénom> <Nom>Brousseur</Nom> </Personne> <Personne Salaire="2900"> <Prénom>Xavier</Prénom> <Nom>Reynold</Nom> </Personne> <Personne Salaire="5100"> <Prénom>Jim</Prénom> <Nom>Lenz</Nom> </Personne> </Personnes>
Exemple pratique (2) • Ouverture du fichier xmlParser = new XMLParser(); FileInputStream inputStream = new FileInputStream("data.xml"); Personnes personnes = xmlParser.input(inputStream); inputStream.close(); • Liste et augmentation for (Enumeration e=personnes.getPersonne(); e.hasMoreElements(); ) { Personne p = (Personne)e.nextElement(); int salaire = Integer.parseInt(p.getSalaire()); int salaire2 = (int)(1.1 * salaire); System.out.println(p.getNom().getText() + " " + p.getPrenom().getText() + " : " + salaire); p.setSalaire(Integer.toString(salaire2)); } • Enregistrement du résultat personnes.save("new-data.xml");
Exemple pratique (3) : Résultat • Terminal / Ligne de commande : Blanc Julie : 4000 Toufou Jean : 3200 Nalup Sophie : 6500 De Reck Claire-Lise : 7000 Brousseur Philippe : 6800 Reynold Xavier : 2900 Lenz Jim : 5100 • Fichier new-data-xml : <Personnes> <Personne Salaire="4400"> <Prénom>Julie</Prénom> <Nom>Blanc</Nom> </Personne> <Personne Salaire="3520"> <Prénom>Jean</Prénom> <Nom>Toufou</Nom> </Personne> <Personne Salaire="7150"> <Prénom>Sophie</Prénom> <Nom>Nalup</Nom> </Personne> <Personne Salaire="7700"> <Prénom>Claire-Lise</Prénom> <Nom>De Reck</Nom> </Personne> <Personne Salaire="7480"> <Prénom>Philippe</Prénom> <Nom>Brousseur</Nom> </Personne> <Personne Salaire="3190"> <Prénom>Xavier</Prénom> <Nom>Reynold</Nom> </Personne> <Personne Salaire="5610"> <Prénom>Jim</Prénom> <Nom>Lenz</Nom> </Personne> </Personnes>
Méthodologie • Lecture de la DTD source • Génération de classes Java correspondant aux éléments de la DTD • Création d’une grammaire basée sur la DTD pour le parseur XML • Améliorations de l’accessibilité des éléments XML
Lecture de la DTD source • Création d’une grammaire JavaCC d’après la description BNF du W3C • Projet Exolab (www.exolab.org) • Parseur de recherche et remplacement des entités paramétrées • Parseur principal, classique, de représentation de la DTD sous forme hiérarchique en mémoire
Utilisation de DTD2Java Structure du fichier Grammaire DTD Stockage d’information dans un fichier XML Génération d’un parseur spécialisé Classes Java pour la lecture/écriture des fichiers XML
Génération de classes Java • Représentation des éléments XML en mémoire • Hiérarchie identique à celle du fichier XML • Accès facile, avec des méthodes get[Élément], set[Élément] • Cas des éléments à répétition : (E)* ou (E)+ • Gestion dans une liste, un vecteur ou une autre structure de données conservant l’ordre • Ajout / Suppression / Modification autorisées
Fonctionnement interne Personne Personnes Liste de personnes Prenom Nom <!ELEMENT Personnes (Personne)*> <!ELEMENT Personne (Prénom, Nom)> <!ELEMENT Prénom (#PCDATA)> <!ELEMENT Nom (#PCDATA)> <!ATTLIST Personne Salaire CDATA #REQUIRED> Prenom Nom Age Contenu texte Contenu texte
Fonctionnement interne (2) <!ELEMENT Personnes (Personne)*> <!ELEMENT Personne (Prénom, Nom)> <!ELEMENT Prénom (#PCDATA)> <!ELEMENT Nom (#PCDATA)> <!ATTLIST Personne Salaire CDATA ...> /** * Match an element 'Personnes'. */ Personnes matchPersonnes() : { Personnes ret = new Personnes(); } { <STAGO> <readPERSONNES> ( <TAGC> { token_source.SwitchTo(CharDataSect); } ( LOOKAHEAD(2) [ <S> ] { Personne personne; } personne = matchPersonne() { ret.addPersonne(personne); } )* [ <S> ] <ETAGO> [ <S> ] <readPERSONNES> [ <S> ] <TAGC> ) { token_source.SwitchTo(CharDataSect); } { return ret; } }
Gestion des attributs /** * Match an element 'Personne'. */ Personne matchPersonne() : { Personne ret = new Personne(); } { <STAGO> <readPERSONNE> ( LOOKAHEAD(2) <S> ( Attribute(ret) )? )* ( <TAGC> { token_source.SwitchTo(CharDataSect); } // La suite du code a été coupée void Attribute(Object obj) : { String attname; String value; String methodName = null; } { attname = QStringName() { token_source.SwitchTo(EqSect); } Eq() { token_source.SwitchTo(AttValueSect); } value = AttValue() { if (obj.getClass().getName().equals("Personne")) { if (attname.equals(“Salaire")) methodName = "setSalaire"; } invokeMethod(obj, methodName, value); return; } } Utilisation de la réflexion
Gestion des attributs (2) • Fonction générique • Ne tient pas compte de la liste définie dans la DTD • Ne tient pas compte du type d’attribut (required, implied, …) • Gestion dans les classes elles-même • Intégrité pendant toute la vie de l’objet
Gestion des listes <!ELEMENT Véhicules (Moto | Voiture | Vélo)*> <!ELEMENT Moto EMPTY> <!ELEMENT Voiture EMPTY> <!ELEMENT Vélo EMPTY> for (Enumeration e=vehicules.getChildElements(); e.hasMoreElements(); ) { Object obj = e.nextElement(); String className = obj.getClass().getName(); if (className.equals("Moto") { Moto moto = (Moto) obj; // Traitement moto } else if (className.equals("Voiture") { Voiture voiture = (Voiture) obj; // Traitement voiture } else if (className.equals("Velo") { Velo velo = (Velo) obj; // Traitement vélo } }
Conclusion / Questions • DTDs bien structurées • Peu d’imbrication dans les déclarations • Java 1.4.x • http://ic2.epfl.ch/~persegue/dtd2java • Démonstration pas-à-pas