Upload
onesime-merlin
View
102
Download
0
Embed Size (px)
Citation preview
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>
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");
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>
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
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
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
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
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>
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; }}
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; }}
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
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
}}
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