1 / 14

Projet de semestre

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 ">

Download Presentation

Projet de semestre

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Projet de semestre Responsable : Prof. Claude Petitpierre Superviseur : Duy Vo Duc

  2. 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>

  3. 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");

  4. 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>

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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; } }

  11. 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

  12. 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

  13. 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 } }

  14. 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

More Related