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

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

Embed Size (px)

Citation preview

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

Projet de semestre

Responsable : Prof. Claude Petitpierre

Superviseur : Duy Vo Duc

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

2L T ILaboratoire deTéléinformatique

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>

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

3L T ILaboratoire deTéléinformatique

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

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

4L T ILaboratoire deTéléinformatique

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>

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

5L T ILaboratoire deTéléinformatique

Méthodologie

1. Lecture de la DTD source

2. Génération de classes Java correspondant aux éléments de la DTD

3. Création d’une grammaire basée sur la DTD pour le parseur XML

4. Améliorations de l’accessibilité des éléments XML

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

6L T ILaboratoire deTéléinformatique

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

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

7L T ILaboratoire deTéléinformatique

Utilisation de DTD2Java

Stockage d’informationdans un fichier XML

Structure du fichierGrammaire DTD

Génération d’unparseur spécialisé

Classes Java pourla lecture/écrituredes fichiers XML

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

8L T ILaboratoire deTéléinformatique

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

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

9L T ILaboratoire deTéléinformatique

Personne

NomPrenom

Fonctionnement interne

Contenu texte Contenu texte

PrenomNomAge

Liste de personnes

Personnes

<!ELEMENT Personnes (Personne)*><!ELEMENT Personne (Prénom, Nom)><!ELEMENT Prénom (#PCDATA)><!ELEMENT Nom (#PCDATA)><!ATTLIST Personne Salaire CDATA #REQUIRED>

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

10L T ILaboratoire deTéléinformatique

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

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

11L T ILaboratoire deTéléinformatique

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

Utilisation de la réflexion

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

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

12L T ILaboratoire deTéléinformatique

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

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

13L T ILaboratoire deTéléinformatique

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

}}

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

14L T ILaboratoire deTéléinformatique

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