La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

XML::Twig pour les Nuls ● FPW::Lyon 2007 - mirod FPW::Lyon 2007mirod.

Présentations similaires


Présentation au sujet: "XML::Twig pour les Nuls ● FPW::Lyon 2007 - mirod FPW::Lyon 2007mirod."— Transcription de la présentation:

1 XML::Twig pour les Nuls ● FPW::Lyon 2007 - mirod FPW::Lyon 2007mirod

2 pendant votre sieste au programme: un peu de code pendant que vous êtes encore réveillés un peu d'histoire ou les aventures d'XML::Twig à travers les âges

3 un peu de XML du XML venu des ressources humaines (c'est trop facile de se moquer du marketing) Structure: db: employé+ employé: état-civil, emploi état-civil: prénom, nom, naissance, nationalité emploi: poste+ poste: nom, durée, paye paye: (salaire|bonus)+ salaire: durée, montant (attributs) bonus: date, montant (attributs), texte

4 quelques “crochets pointus” Pierre Duteil 1970-01-01 FR Programmeur 2002-01 – courant menace de départ...

5 un premier bout de code #!/usr/bin/perl -CSD # sort les nom, intitulés de poste et salaires de tous les employés # utilise un style DOM (charge tout le XML avant de se mettre à bosser) use strict; use warnings; use utf8; use XML::Twig; my $twig= XML::Twig->parse( "hr_data.xml");

6 le Modèle Objet de XML::Twig 2 types d'objets le document: XML::Twig les éléments: XML::Twig::Elt les textes sont dans des éléments #PCDATA les commentaires et processing instructions sont dans des éléments #COMMENT et #PI les attributs ne sont pas des objets, mais sont accessibles à partir de leur élément (bon, je triche, il y a d'autres classes, mais c'est pour ceux qui utilisent des DTD, il en reste 4 et ils sont pas là)

7 oh, un arbre documen t db employé état-civil prénom nom naissanc e nationalit é #PCDAT A Pierre #PCDAT A Duteil #PCDAT A 1970-01- 01 #PCDAT A FR id: e0001 emploi id: e0002

8 revenons au code #!/usr/bin/perl -CSD # sort les nom, intitulés de poste et salaires de tous les employés # utilise un style DOM (charge tout le XML avant de se mettre à bosser) use strct; use warnings; use utf8; use XML::Twig; my $twig= XML::Twig->parse( "hr_data.xml"); foreach my $employé ($twig->root->children( 'employé')) { my $état_civil= $employé->first_child( 'état-civil'); my $poste= $employé->first_child( 'emploi')->first_child( 'poste'); my $salaire= $poste->first_child( 'paye') ->first_child( 'salaire') ->att( 'montant'); printf "%s, %s (%s): €%d\n", $état_civil->field( 'nom'), $état_civil->field( 'prénom'), $poste->field( 'nom'), $salaire ; }

9 ça marche! $./hr1 Duteil, Pierre (Programmeur): €1500 Forgeron, Jean (Chef de service): €2500 Forgeron, Jules (Chef de département): €3500 Dufour, Jerôme (Programmeur): €1500 Schmoltz, John (Chef Comptable): €4500 Au moins pendant les tests!

10 DOM - SAX - Twig Traitement en mode arborescent c'est ce quon vient de voir normalisé par le DOM Traitement évènementiel traitement au fur et à mesure du parsing normalisé par SAX Twig accès à l'arbre d'un élément dès qu'il est parsé handler appelé quand le tag fermant est parsé ni DOM ni SAX

11 ça marche encore mieux! #!/usr/bin/perl -CSD # sort les nom, intitulés de poste et salaires de tous les employés # utilise un handler (chaque employé est traité puis purgé) use strict; use warnings; use utf8; use XML::Twig; my $twig= XML::Twig->new( twig_handlers => { employé => \&employé }) ->parsefile( "hr_data.xml"); sub employé { my( $twig, $employé)= @_; my $état_civil= $employé->first_child( 'état-civil'); my $poste= $employé->first_child( 'emploi')->first_child( 'poste'); my $salaire= $poste->first_child( 'paye')->first_child( 'salaire') ->att( 'montant'); printf "%s, %s (%s): €%d\n", $état_civil->field( 'nom'), $état_civil->field( 'prénom'), $poste->field( 'nom'), $salaire; $twig->purge; }

12 Toujours plus de handlers #!/usr/bin/perl -CSD # sort les nom, intitulés de poste et salaires de tous les employés # les salaires sont convertis en KF/ans use strict; use warnings; use utf8; use XML::Twig; my $twig= XML::Twig->new( twig_handlers => { employé => \&employé, salaire => \&salaire, } ) ->parsefile( "hr_data.xml"); sub employé {... } sub salaire { my( $twig, $salaire)= @_; my $montant= $salaire->att( 'montant'); $montant= sprintf( "%d Kf", $montant * 6.65 * 12 / 1000); $salaire->set_att( montant => $montant); }

13 Ca marche toujours $./hr3 Duteil, Pierre (Programmeur): 119 Kf Forgeron, Jean (Chef de service): 199 Kf Forgeron, Jules (Chef de département): 279 Kf Dufour, Jerôme (Programmeur): 119 Kf Schmoltz, John (Chef Comptable): 359 Kf Bieng sûr ça convertit tous les salaires

14 déclencheur de handler #!/usr/bin/perl -CSD # sort les nom, intitulés de poste et salaires de tous les employés # les salaires sont convertis en KF/ans # seuls les salaires courants sont convertis use strict; use warnings; use utf8; use XML::Twig; my $twig= XML::Twig->new( twig_handlers => { employé => \&employé, 'salaire[@durée=~/courant/]' => \&salaire, } ) ->parsefile( "hr_data.xml"); sub employé {... } sub salaire { my( $twig, $salaire)= @_; my $montant_euro= $salaire->att( 'montant'); my $montant_kf= sprintf( "%d Kf", $montant_euro * 6.65 * 12 / 1000); $salaire->set_att( montant => $montant_kf); warn "W salaire converti: €$montant_euro/mois to $montant_kf/an\n"; }

15 plus efficace! $./hr4 W salaire converti: €1500/mois to 119 Kf/an Duteil, Pierre (Programmeur): 119 Kf W salaire converti: €2500/mois to 199 Kf/an Forgeron, Jean (Chef de service): 199 Kf W salaire converti: €3500/mois to 279 Kf/an Forgeron, Jules (Chef de département): 279 Kf W salaire converti: €1500/mois to 119 Kf/an Dufour, Jerôme (Programmeur): 119 Kf W salaire converti: €4500/mois to 359 Kf/an Schmoltz, John (Chef Comptable): 359 Kf

16 d'autres méthodes utiles cut, paste, print, flush prefix, suffix, insert_new_element erase, wrap descendants, ancestors, inherit_att finish, finish_now, simplify twig_roots: autre mode de traitement twig_roots => { salaire => \&salaire }, twig_print_outside_roots => 1, imprimer le salaire dans le handler: $salaire->print plein, PLEIN d'autres (certains disent trop)

17 en vrac, plus de pub Quelques particularités utiles: gestion des blancs non significatifs gestion des commentaires, PI possibilité de rester dans un encodage autre que l'UTF8 moteur Xpath piqué à XML::XPath support des espaces de noms Le but du module est d'être pratique, et de respecter le principe de moindre surprise. Pas forcément de faire toujours plaisir aux extrémistes de l'XML. “XML, The Perl Way”

18 en prime (et pour le même prix!) XML::Twig est livré avec quelques outils utiles: xml_grep un grep utilisant XPath xml_split / xml_merge découpe, rassemble, de gros fichiers XML en une suite de fichiers plus petits xml_pp pretty print de documents XML

19 au final XML::Twig fait tout, du sol au plafond! (au moins chez moi!) transformer du XML en XML c'est même fait pour ça extraire des donnèes de XML au cas où vous viendriez de vous réveiller pareil avec du XHTML ou même du HTML il utilise HTML::TreeBuilder pour convertir le HTML en XML convertir divers formats en XML 2 étapes: convertir en XML “grossier”, puis structuration de ce XML à l'aide de méthodes spécialisées

20 LA ressource xmltwig.com (et perlmonks, la mailing liste perlxml, cpanforum, les newsgroups) Google Alert

21 si vous n'êtes pas convaincus Il y a d'autres bons modules XML::LibXML D'autres qui plaisent à certains XML::Simple XML::SAX XML::Rules XML::Parser Mais ne touchez pas à XML::XPath XML::DOM

22 un peu d'histoire l'histoire de XML::Twig en prime, une récap des 10 dernières années du monde Perl Ah oui, et développer un module, qu'est-ce que ça veut dire.

23 1998 Modules XML: XML::Parser, XML::DOM, XML::Grove, XML::Simple Rieng pour traiter de gros fichiers (la mémoire était chère à l'époque) The Perl Conference 3.0 Réaction générale à mes élucubrations: “Show us some code”

24 si tôt dit, si tôt fait A l'époque c'était facile peu de tests documentation... légère perl 5.005 module simple peu de dépendances La vie était belle

25 depuis 2 versions majeures de Perl (10 sous-versions) (3 traitements d'unicode différents) il faut tout tester (et le prouver) le module se complexifie (beaucoup!) garder la compatibilité devient très compliqué mais de plus en plus d'aides

26 Perl support unicode: 5.005: rieng 5.6.*: ça commence 5.8.0: bon support (clés de hash,regexps), mais pleins de... idiosyncrasies 5.8.1+: mieux pour les reste, curieusement peu d'impacts de mon point de vue l'évolution du langage s'est fait largement à travers ses modules et sa culture

27 ça me prend les testes! Un changement de culture incroyable The Perl Phalanx Devel::Cover Passage de 50% à 90% de couverture 3 mois, quelques centaines de tests des années à souffrir des conséquences écrire des tests portables, c'est DUR Mais ça PAYE!

28 CPAN Testers L'évolution marquante de l'année Permet d'avoir les résultats des tests sur des configurations extrémement variées: différents OS différentes versions de Perl divers jeux de modules installés

29 autres aides RT pas assez utilisé Perlmonks a largement remplacé les newsgroups CPAN ratings pas assez utilisé search.cpan.org liens vers quasiment tout le reste cpan forums, annot cpan, cpants

30 l'aide la plus utile les UTILISATEURS “normaux” auteurs de modules basés sur XML::Twig donnent des idées servent de cobayes me forcent à rester propre c'est chiant mais ça paye des fois ils me font peur!

31 est-ce que ça vaut le coup? OUI! un module utilisé c'est sympa ça force à se tenir au courant à bien réfléchir aux interfaces ça fait plaisir c'est du boulot des fois c'est très chiant ça permet de causer dans les conférences


Télécharger ppt "XML::Twig pour les Nuls ● FPW::Lyon 2007 - mirod FPW::Lyon 2007mirod."

Présentations similaires


Annonces Google