Retour au Perl et XML - Maitrise Tal 2002


TD PERL ET XML. Une introduction à la manipulation des documents XML avec Perl
                                   ----------- Modifications des programmes -----------  

 

 

-------------------------------------------> useXMLParser:  imprime le message d'erreur

 

use XML::Parser;

$p = new XML::Parser(ErrorContext => 2);

eval {$p->parsefile($ARGV[0])};

print "Error : $@\n" if $@;  # imprime erreur s'il y a une erreur

 

 

-------------------------------------------> document .xml bien formé

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

---------------------------------->  Résultat sous MS-DOS : document bien formé donc pas de message d'erreur

C:\GOSIA\perloo\PerlXml>perl useXMLParser-helloWord.pl articles.xml>>resu.txt

 

C:\GOSIA\perloo\PerlXml>

 

 

----------------------------------------------> useXMLParser-helloWord.pl : imprime le message d'erreur

sur le document.xml mal formé

use XML::Parser;

$p = new XML::Parser(ErrorContext => 2);

eval {$p->parsefile($ARGV[0])};

print "Error : $@\n" if $@;  # imprime erreur s'il y a une erreur

 

 

-------------------------------------------->  document .xml mal formé

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

   <ARTICLES> # mal formé

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

------------------------------------------>  Résultat sous MS-DOS : document mal formé

 

C:\GOSIA\perloo\PerlXml>perl useXMLParser-helloWord.pl articlesBad.xml

Error :

mismatched tag at line 15, column 5, byte 433:

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

====^

   <ARTICLE>

      <FORME>cafardeux</FORME>

 at C:/Perl/site/lib/XML/Parser.pm line 168

 

 

C:\GOSIA\perloo\PerlXml>

 

 

6) Programmes Perl

 

XML::Parser avec handler

 

Exemple 1 :

 

 

 

--------------------------------------> Parser avec handler :useXMLParser0.pl

affiche début et fin de balise

 

use XML::Parser;

 

$file=shift;

 

my $parser = new XML::Parser(ErrorContext => 2);

$parser->setHandlers(Start => \&start_handler,

End   => \&end_handler,

Char  => \&char_handler);

 

$parser->parsefile($file);

print "\n Fin Doc."; # affiche Fin Doc.

 

# Définition des handlers

sub start_handler

{

my $expat = shift; my $element = shift; # element is the name of the tag

print "<$element"; # debut balise

}

 

sub end_handler

{

my $expat = shift; my $element = shift;

print  "$element>"; # fin balise

}

 

sub char_handler

{

my ($p, $data) = @_;

print " $data "; # espace entre les mots

}

 

 

---------------------------------------------------->  articles.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

----------------------------------------->  Résultat sous MS-DOS : imprime début et fin de balise

 

C:\GOSIA\perloo\PerlXml>perl useXMLParser0.pl articles.xml

<DICTIONNAIRE

     <head

       <title Petit Dictionnaire title>

       <where ILPGA TAL P3 2001 where>

       <author S. Fleury author>

       <org ILPGA P3 org>

     head>

      <ARTICLE

         <FORME bidingue FORME>

         <GRAMMAIRE

            <CATEGORIE n. et adj., CATEGORIE>

         GRAMMAIRE>

         <ETYMOLOGIE de bilingue et de dingue ETYMOLOGIE>

         <ACCEPTION

            <DEFINITION qui d    lire en deux langues DEFINITION>

         ACCEPTION>

         <ACCEPTION

            <DEFINITION bilingue fou. DEFINITION>

         ACCEPTION>

      ARTICLE>

      <ARTICLE

         <FORME cafardeux FORME>

         <GRAMMAIRE

            <CATEGORIE adjectif CATEGORIE>

         GRAMMAIRE>

         <ETYMOLOGIE de cafard et de deux ETYMOLOGIE>

         <ACCEPTION

            <DEFINITION couple qui s'ennuie DEFINITION>

         ACCEPTION>

      ARTICLE>

 DICTIONNAIRE>

 Fin Doc.

C:\GOSIA\perloo\PerlXml>

 

 

Exemple 2 :

 

-------------------------------------------------> useXMLParser1.pl

 

#!/usr/bin/perl -w

 

use strict;

use XML::Parser;

 

# Files & Directories

my ($inFile, $outFile) = @ARGV;

 

# Variables

my @errors;

 

# Open the input file

open (INFILE, $inFile) or die "Couldn't open $inFile for input: $!";

 

# Open the output file

open (OUTFILE, '>$outFile') or die "can't open output file $outFile : $!";

 

# define $parser and set up event handlers

my $parser = new XML::Parser( NoExpand => 1,

                                                      ErrorContext => 1,

                                                      Handlers => {Start => \&my_start_tag,

                                                                                    End => \&my_end_tag,

                                                                                    Char => \&my_char,

                                                                                    Default => \&my_default

                                                                                    },

                                                      );

 

# Parse the input file

eval {

                $parser->parse(*INFILE);

};

 

# Any errors will have been caught by the "eval" above and placed in $@

if( $@ ) {

                push( @errors, $@ );

}

 

close INFILE;

close OUTFILE;

 

if (@errors) {

                foreach (@errors) {print "$_\n"}

}

 

sub my_start_tag {

                print "***Executing StartTag***\n";

                my ($this, $element, %attributes) = @_;

                my $string = $this->original_string;

                print "StartTag->$string<-\n\n";

                print OUTFILE $string;

} # end of my_start_tag

 

sub my_end_tag {

                print "***Executing EndTag***\n";

                my ($this, $element) = @_;

                my $string = $this->original_string;

                print "EndTag->$string<-\n\n";

                print OUTFILE $string;

} # end of my_end_tag

 

sub my_char {

                print "***Executing Char***\n";

                my $this = shift;

                my $string = $this->original_string;

                print "Char->$string<-\n";

                print "Length: " . length($string) . "\n\n";

                print OUTFILE $string;

} # end of my_char

 

sub my_default {

                print "***Executing Default***\n";

                my $this = shift;

                my $string = $this->original_string;

                print "Default->$string<-\n";

                print "Length: " . length($string) . "\n\n";

                print OUTFILE $string;

} # end of my_default

 

-------------------------------------------------> articles.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

------------------------------------------------->Résultat sous MS-DOS

 

 

 

 

Exemple 3 :

 

-------------------------------------------------> useXMLParser2.pl

 

#!/usr/bin/perl -w

use XML::Parser;

my $level = -1;  # Display item at this indent level

 

#  Create the new parser, set up the various handlers, and

#  parse the XML file.

 

my $parser = new XML::Parser(ErrorContext => 2);

 

$parser->setHandlers(

    Start => \&start_handlerEventXML,

    Char  => \&char_handlerEventXML,

    End   => \&end_handlerEventXML,

);

 

if ($ARGV[0]) {

    $parser->parsefile($ARGV[0]);

} else {

    print "You must supply an XML filename\n";

    exit(1);

}

 

#  Character and tag event handlers

 

sub start_handlerEventXML {

    my ($p, $element, %attrib) = @_;

    my $name;

    my $val;

 

    #  Increment our print level with the Start Tag

 

    $level++;

 

    #  Display the element name and all the attributes

 

    print "   " x $level;

    print "$element ";

   

    while (($name, $val) = each %attrib) {

                print "A:$name=>$val ";

    }

 

    print "\n";

}

 

sub char_handlerEventXML {

    my ($p, $text) = @_;

 

    #  Only display non-whitespace text

 

    if ($text =~ /\S+/) {

                ++$level;

 

                $text =~ s/^\s+//;  #  Remove beginning whitespace

 

                print "   " x $level;

                print "Text:[$text]\n";

                --$level;

    }

}

 

sub end_handlerEventXML {

    #  Decrement our print level

 

    $level--;

}

 

 

 

-----------------------------------------------> programme personnalisé artperso.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Journal</title>

    <where>ILPGA TAL P3 2002</where>

    <author>M. Stachura</author>

    <org>Asso Perso</org>

  </head>

   <ARTICLE>

      <FORME>convaincu</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adj.</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de con et de vaincu</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>idiot qui a subi une defaite</DEFINITION>

      </ACCEPTION>

    </ARTICLE>

   <ARTICLE>

      <FORME>chaloupe</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n.f</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de chat et de loupe</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>loupe en forme de chat</DEFINITION>

      </ACCEPTION>

       <ACCEPTION>

         <DEFINITION>un chat qui est rate</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

 

 

-------------------------------------------->  Résultat sous MS-DOS _ L'exécution du code précedent sur artperso.xml

 

C:\GOSIA\perloo\PerlXml>perl useXMLParser2.pl artperso.xml

DICTIONNAIRE

   head

      title

         Text:[Journal]

      where

         Text:[ILPGA TAL P3 2002]

      author

         Text:[M. Stachura]

      org

         Text:[Asso Perso]

   ARTICLE

      FORME

         Text:[convaincu]

      GRAMMAIRE

         CATEGORIE

            Text:[adj.,]

      ETYMOLOGIE

         Text:[de con et de vaincu]

      ACCEPTION

         DEFINITION

            Text:[idiot qui a subi une defaite]

   ARTICLE

      FORME

         Text:[chaloupe]

      GRAMMAIRE

         CATEGORIE

            Text:[n.f]

      ETYMOLOGIE

         Text:[de chat et de loupe]

      ACCEPTION

         DEFINITION

            Text:[loupe en forme de chat]

      ACCEPTION

         DEFINITION

            Text:[un chat qui est rate]

 

C:\GOSIA\perloo\PerlXml>

 

 

 

Exemple4 :

 

 

--------------------------------------> Programme  useXMLParserHandler-msfag.pl

-- Ce programme effectue une conversion d'un doc. html à partir d'un doc. xml

 

#!/usr/bin/perl -w

 

use strict;

use XML::Parser;

 

die "Usage: xmlfaq.pl <file>" unless @ARGV == 1;

my $parser = new XML::Parser(Handlers => {Start => \&handle_start,

                                          End   => \&handle_end,

                                                                  Char  => \&handle_char});

$parser->parsefile($ARGV[0]);

 

sub handle_start {

    my $p = shift;

    my $el = shift;

 

    if ($el =~ /\bheader\b/i) {

                print '<CENTER>';

    } elsif ($el =~ /\btitle\b/i) {

                print '<H1><FONT COLOR="crimson"><U>';

    } elsif ($el =~ /\bauthor\b/i) {

                print '<FONT SIZE=+1><FONT COLOR="brown">Auteur : <B>';

    } elsif ($el =~ /\bversion\b/i) {

                print '<H4><FONT COLOR="brown">Date : <B>';

    } elsif ($el =~ /\babstract\b/i) {

                print '<HR><CENTER><FONT SIZE=+2><FONT COLOR="brown"><B>~~ Informations Presse ~~</B></FONT><FONT COLOR="#CC3366"><P>';

    } elsif ($el =~ /\bsection\b/i) {

                print '<FONT COLOR="brown"><UL>';

    } elsif ($el =~ /\bquestion\b/i) {

                print '<li><B><FONT COLOR="brown">Question : </FONT><FONT COLOR="chocolate"></B>';

    } elsif ($el =~ /\banswer\b/i) {

                print '<dl><BR><B><FONT COLOR="darkgreen">Reponse : </FONT><FONT COLOR="olive"></B>';

    }

}

 

sub handle_char {

    my ($p, $data) = @_;

    print $data;

}

 

sub handle_end {

    my $p = shift;

    my $el = shift;

 

    if ($el =~ /\bheader\b/i) {

                print "</CENTER>";

    } elsif ($el =~ /\btitle\b/i) {

                print "</FONT></H1></U><BR>";

    } elsif ($el =~ /\bauthor\b/i) {

                print "</B></FONT></FONT><BR>";

    } elsif ($el =~ /\bversion\b/i) {

                print "</B></FONT></H4>";

    } elsif ($el =~ /\babstract\b/i) {

                print "</FONT></FONT></CENTER><HR><P>\n";

    } elsif ($el =~ /\bsection\b/i) {

                print "</FONT></UL>";

    } elsif ($el =~ /\bquestion\b/i) {

                print "</FONT></li>";

    } elsif ($el =~ /\banswer\b/i) {

                print "</FONT></BR></dl>";

    }

}

 

 

 

----------------------------------> Programme personnalisé msfaq.xml

 

<faq>

   <header>

      <title>Conference de plenipotentiaires</title>

      <author>M. Stachura</author>

      <version>Avril 2002</version>

   </header>

   <abstract>Questions/Reponses sur la conference de plenipotentiaires.</abstract>

   <section>

      <question>Qui peut participer a la Conference?</question>

      <answer>Les organisations/entites suivantes sont invitees en qualite d'observateurs :

 

Organisation des Nations Unies;

Organisations regionales de telecommunication visees a l'article 43 de la Constitution;

Organisations intergouvernementales exploitant des systemes a satellites;

Institutions specialisees de l'Organisation des Nations Unies et Agence internationale de l'energie atomique;

 </answer>

   </section>

   <section>

      <question>Qui a le droit de voter?</question>

      <answer>Article 3 de la Constitution : Tout Membre a, sous reserve des dispositions des numeros 169 et 210 de la Constitution, droit a une voix a toutes les Conferences de plenipotentaires.</answer>

   </section>

</faq>

 

 

 

 

 

 

 

----------> Parsage sous MS-DOS

 

C:\GOSIA\perloo\PerlXml>perl useXMLParserHandler-msfaq.pl msfaq.xml>>msfaq.html

 

C:\GOSIA\perloo\PerlXml>

 

 

 

 

------------------------> Résultat sous I.E.

 

 

 

 

Exemple5 :

 

 

 

---------------------------> Interface graphique de Perl/Tk  useXMLParserWithTK.pl

 

#!/usr/bin/perl -w

 

use Tk;

use XML::Parser;

require Tk::HList;

 

my $main;

my $status;

my $list;

my @xmllist;

 

create_ui();

 

my $parser = new XML::Parser(Style => 'tree');

@xmllist = $parser->parsefile($ARGV[0]);

fill_list(@xmllist);

 

MainLoop();

 

#---------------------------------------------------------------------------

#  Subroutines

#---------------------------------------------------------------------------

 

my @tags;

my %tag_count;

 

sub fill_list {

    my $xml = shift;

    my $tag;

    my $value;

 

    while (@$xml) {

                $tag   = shift @$xml;

                $value = shift @$xml;

 

                if ($tag) {

                    $tag_count{$tag}++;

                    push @tags, $tag . "." . $tag_count{$tag};

 

                    $list->add(

                                get_name(),

                                -text       => $tag,

                                -data       => shift @$value,

                                -itemtype   => 'text',

                    );

 

                    fill_list($value);

 

                    pop @tags;

                } else {

                    my $text = $value =~ s/\s+/ /g;

 

                    $tag_count{"_value_"}++;

 

                    $list->add(

                                get_name() . "|value." . $tag_count{"_value_"},

                                -text       => "Value: " . $value,

                                -itemtype   => 'text',

                    );

                }

    }

}

 

sub get_name {

    my $name = join '|', @tags;

    return $name;

}

 

sub create_ui {

    $main = MainWindow->new; #creation fenetre

    my $menu_bar = $main->Frame()->pack(-side => 'top');

    $main->title("Exemple 5 : UseXMLParserWithTK modifie");

 

    $list = $main->Scrolled(

                'HList',

                -drawbranch => 1,

                -separator  => '|',

                -indent     => 20,

                -height     => 30,

                -width      => 50,

                -background => "#CC3366",

        -foreground => "green",

                -cursor => "mouse",

       )->pack(

                -fill       => 'both',

                -expand     => '1',

    );

 

   $status = $main->Frame(-background => "maroon",)->pack(-side => 'bottom');

 

   $status->Button(-bitmap => 'info',

                                    -command => sub{ MainWindow->new },

        -width => 12,

        -borderwidth => 2,

        -background => "maroon",

        -activebackground => "white",

        -foreground => "white",

        -activeforeground => "maroon",

        -cursor => "circle",

    )->pack(

                -side => 'left',

                -expand => 1,

                -fill => 'both',

                -anchor => 'sw',

                -padx => 11,

                -pady => 3,

   );

 

    $status->Button(-text => ">> Quitter <<",

                                    -command => sub { exit },

        -width => 48,

        -borderwidth => 2,

        -background => "maroon",

        -activebackground => "plum",

        -foreground => "orange",

        -activeforeground => "red",

        -cursor => "X_cursor",

    )->pack(

                -side => 'right',

        -expand => 1,

                -fill => 'both',

        -anchor => 'se',

                -padx => 5,

                -pady => 2,

   );

 

    $status = $main->Frame(-background => "maroon",)->pack(-side => 'bottom');

    $status->Label(-text => 'Auteur:',

        -foreground => "white",

        -background => "maroon",

       )->pack(

                -side => 'left',

                -anchor => 'nw',

                -padx => 2,

                -pady => 2,

    );

 

    $status->Label(-text => "M. Stachura - Avril 2002 - ILPGA",

                -width  => 50,

                -relief => 'ridge',

        -borderwidth => 2,

        -background => "maroon",

        -foreground => "white",

    )->pack(

                -fill => 'both',

        -expand => 1,

                -padx => 2,

                -pady => 2,

    );

}

 

 

 

---------------------------> fichier artperso.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Journal</title>

    <where>ILPGA TAL P3 2002</where>

    <author>M. Stachura</author>

    <org>Asso Perso</org>

  </head>

   <ARTICLE>

      <FORME>convaincu</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adj.</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de con et de vaincu</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>idiot qui a subi une defaite</DEFINITION>

      </ACCEPTION>

    </ARTICLE>

   <ARTICLE>

      <FORME>chaloupe</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n.f</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de chat et de loupe</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>loupe en forme de chat</DEFINITION>

      </ACCEPTION>

       <ACCEPTION>

         <DEFINITION>un chat qui est rate</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

----------------------------------------> Parsage sous MS-DOS et résultat

 

C:\GOSIA\perloo\PerlXml>perl useXMLParserWithTK.pl artperso.xml

 

 

 

 

 

 

 

 

 

XML:: Parser avec style (1) sur artperso.xml

 

 

------------------------------> useXMLParser3.pl

 

use XML::Parser;

 

$file=shift;

 

my $parser = new XML::Parser(Style=>'Subs',

                            ErrorContext => 2);

 

$parser->setHandlers(Char  => \&char_handler);

 

$parser->parsefile($file);

 

# Définition des fonctions

sub ARTICLE

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "$element";

}

sub ARTICLE_

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "----------oooooooooo----------\n";

}

 

sub CATEGORIE

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "$element : ";

}

sub CATEGORIE_

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "\n";

}

 

sub FORME

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "$element : ";

}

sub FORME_

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "\n";

}

 

sub ETYMOLOGIE

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "$element : ";

}

sub ETYMOLOGIE_

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "\n";

}

 

sub ACCEPTION

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "$element : ";

}

sub ACCEPTION_

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "\n";

}

 

sub GRAMMAIRE

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "$element : ";

}

sub GRAMMAIRE_

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "\n";

}

 

sub DEFINITION

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "$element : ";

}

sub DEFINITION_

{

my $expat = shift; my $element = shift;

 

# element is the name of the tag

print "\n";

}

 

 

sub char_handler

{

my ($p, $data) = @_;

print $data;

 

}

 

 

 

----------> Résultat sous MS-DOS

 

C:\GOSIA\perloo\PerlXml>perl useXMLParser3.pl artperso.xml

 

 

    Journal

    ILPGA TAL P3 2002

    M. Stachura

    Asso Perso

 

   ARTICLE

      FORME : convaincu

 

      GRAMMAIRE :

         CATEGORIE : adj.

 

 

 

      ETYMOLOGIE : de con et de vaincu

 

      ACCEPTION :

         DEFINITION : idiot qui a subi une defaite

 

 

 

    ----------oooooooooo----------

 

   ARTICLE

      FORME : chaloupe

 

      GRAMMAIRE :

         CATEGORIE : n.f

 

 

 

      ETYMOLOGIE : de chat et de loupe

 

      ACCEPTION :

         DEFINITION : loupe en forme de chat

 

 

 

       ACCEPTION :

         DEFINITION : un chat qui est rate

 

 

 

   ----------oooooooooo----------

 

 

C:\GOSIA\perloo\PerlXml>

 

 

 

XML:: Parser avec style (2)

 

 

---------------------------->  XML::Parser avec style "Three"  code useXMLParser4.pl

 

#!perl -w

 

use XML::Parser;

 

my $parse = new XML::Parser(Style => 'tree');

 

if ($ARGV[0]) {

    @xmllist = $parse->parsefile($ARGV[0]);

} else {

    print "You must supply a XML file\n";

    exit(1);

}

 

print_list(@xmllist);

 

###

#  Subroutines

###

 

my $level = -1;

 

sub print_list {

    my $var;

 

    foreach $var (@_) {

                if (ref ($var)) {

                    print_ref($var);

                } else {

                    print_scalar($var);

                }

    }

}

 

sub print_scalar {

    ++$level;

    my $var = shift;

    print_indented($var);

    --$level;

}

 

sub print_ref {

    my $r        = shift;

    my $ref_type = ref($r);

 

    if ($ref_type eq "ARRAY") {

                print_array($r);

    } elsif ($ref_type eq "SCALAR") {

                print "Ref -> $r";

                print_scalar($$r);

    } elsif ($ref_type eq "HASH") {

                print_hash($r);

    } elsif ($ref_type eq "REF") {

                ++$level;

                print_indented("Ref -> ($r)");

                print_ref($$r);

                --$level;

    } else {

                print_indented("$ref_type (not supported)");

    }

}

 

sub print_array {

    my ($r_array) = @_;

    ++$level;

    print_indented("[ # $r_array");

    foreach $var (@$r_array) {

                if (ref ($var)) {

                    print_ref($var);

                } else {

                    print_scalar($var);

                }

    }

    print_indented("]");

    --$level;

}

 

sub print_hash {

    my ($r_hash) = @_;

    my ($key, $val);

    ++$level;

    print_indented("{ # $r_hash");

    while (($key, $val) = each %$r_hash) {

                $val = ($val ? $val : '""');

                ++$level;

                if (ref ($val)) {

                    print_indented("$key => ");

                    print_ref($val);

                } else {

                    print_indented("$key => $val");

                }

                --$level;

    }

    print_indented("}");

    --$level;

}

 

sub print_indented {

    $spaces = ":  " x $level;

    print "${spaces}$_[0]\n";

}

 

 

 

----------------------------------> Résultat sous MS-DOS

               ..../....

 

:  :  :  :  ACCEPTION

:  :  :  :  [ # ARRAY(0x22376e4)

:  :  :  :  :  { # HASH(0x22376cc)

:  :  :  :  :  }

:  :  :  :  :  0

:  :  :  :  :

 

:  :  :  :  :  DEFINITION

:  :  :  :  :  [ # ARRAY(0x22365ac)

:  :  :  :  :  :  { # HASH(0x2236594)

:  :  :  :  :  :  }

:  :  :  :  :  :  0

:  :  :  :  :  :  loupe en forme de chat

:  :  :  :  :  ]

:  :  :  :  :  0

:  :  :  :  :

 

:  :  :  :  ]

:  :  :  :  0

:  :  :  :

 

:  :  :  :  ACCEPTION

:  :  :  :  [ # ARRAY(0x2236624)

:  :  :  :  :  { # HASH(0x223660c)

:  :  :  :  :  }

:  :  :  :  :  0

:  :  :  :  :

 

:  :  :  :  :  DEFINITION

:  :  :  :  :  [ # ARRAY(0x223669c)

:  :  :  :  :  :  { # HASH(0x2236684)

:  :  :  :  :  :  }

:  :  :  :  :  :  0

:  :  :  :  :  :  un chat qui est rate

:  :  :  :  :  ]

:  :  :  :  :  0

:  :  :  :  :

 

:  :  :  :  ]

:  :  :  :  0

:  :  :  :

 

:  :  :  ]

:  :  :  0

:  :  :

 

:  :  ]

:  ]

 

C:\GOSIA\perloo\PerlXml>

 

 

Exemple 2 :

 

XML:: Parser avec style (3) 

 

 

------->  Programme useXMLParserMS.pl qui permet d'afficher le code testé sur                 boox.xml

 

# Usage : perl useXMLParserMS.pl book.xml

 

%startsub = (

                     "sect title='1'" ,

                     "para" ,

                     "sect title='1-1'" ,

                     "sect title='1-2'"        

                     );

 

# ---------------------------------------------

 

use XML::Parser;

my $file = shift;

my $parser = new XML::Parser(ErrorContext => 2);

$parser->setHandlers(Start => \&start_handler,

                                     Char  => \&char_handler);

 

$parser->parsefile($file);

 

# ---------------------------------------------

# The handlers for the XML Parser.

 

sub start_handler

{

    my $expat = shift; my $element = shift;

 

    # element is the name of the tag

    print $startsub{$element};

 

    # Handle the attributes

    while (@_) {

                my $att = shift;

                my $val = shift;

                print "$att=$val ";

    }

}

 

sub char_handler

{

    my ($p, $data) = @_;

    print $data;

}

 

------------------------------------>  book.xml

 

<book>

<sect title= '1'>

                <para>1aaaaaaaaaaaaaaaaaaaaa</para>

                <sect title='1-1'>

                                <para>1-1bbbbbbbbbbbbbbbbbbb</para>

                                <para>1-1ccccccccccccccccccccc</para>

                </sect>

                <sect title='1-2'>

                                <para>1-2ddddddddddddddddddd</para>

                                <para>1-2eeeeeeeeeeeeeeeeeeeee</para>

                </sect>

</sect>

<sect title= '2'>

                <para>2aaaaaaaaaaaaaaaaaaaaa</para>

                <sect title='2-1'>

                                <para>2-1bbbbbbbbbbbbbbbbbbb</para>

                                <para>2-1ccccccccccccccccccccc</para>

                </sect>

                <sect title='2-2'>

                                <para>2-2ddddddddddddddddddd</para>

                                <para>2-2eeeeeeeeeeeeeeeeeeeee</para>

                </sect>

</sect>

</book>

 

 

 

 

----------> Résultat sous MS-DOS

 

C:\>perl useXMLParserMS.pl book.xml

 

title=1

        1aaaaaaaaaaaaaaaaaaaaa

        title=1-1

                1-1bbbbbbbbbbbbbbbbbbb

                1-1ccccccccccccccccccccc

 

        title=1-2

                1-2ddddddddddddddddddd

                1-2eeeeeeeeeeeeeeeeeeeee

 

 

title=2

        2aaaaaaaaaaaaaaaaaaaaa

        title=2-1

                2-1bbbbbbbbbbbbbbbbbbb

                2-1ccccccccccccccccccccc

 

        title=2-2

                2-2ddddddddddddddddddd

                2-2eeeeeeeeeeeeeeeeeeeee

 

 

 

C:\>

 

 

 

XML:: Parser avec style (3)

 

    

 

--------------------> Programme useXMLParser5.pl

 

use strict;

 

use XML::Parser;

my $p = XML::Parser->new(Style => 'Objects');

 

my $doc = $p->parsefile(shift);

 

my $level = 0;

process_node($doc->[0]);

 

sub process_node {

  my ($node) = @_;

  my $ind = ' ' x $level;

  my $type = ref $node;

  $type =~ s/^.*:://;

 

  if ($type ne 'Characters') {

    my $attrs = {%$node};

    delete $attrs->{Kids};

    print $ind, $type, ' [';

    print join(', ', map { "$_: $attrs->{$_}" } keys %{$attrs});

    print "]\n";

 

    ++$level;

    foreach my $node (@{$node->{Kids}}) {

      process_node($node);

    }

    --$level;

  } else {

    my $content = $node->{Text};

    $content =~ s/\n/ /g;

    $content =~ s/^\s+//;

    $content =~ s/\s+$//;

    print $ind, $content, "\n" if $content =~ /\S/;

  }

}

 

 

 

  

 

-------------> Programme articles.xml 

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

 

----------> Résultat sous MS-DOS (dernière page)

 

   bidingue

  GRAMMAIRE []

   CATEGORIE []

    n. et adj.,

  ETYMOLOGIE []

   de bilingue et de dingue

  ACCEPTION []

   DEFINITION []

    qui d+®lire en deux langues

  ACCEPTION []

   DEFINITION []

    bilingue fou.

 ARTICLE []

  FORME []

   cafardeux

  GRAMMAIRE []

   CATEGORIE []

    adjectif

  ETYMOLOGIE []

   de cafard et de deux

  ACCEPTION []

   DEFINITION []

    couple qui s'ennuie

 

C:\>perl useXMLParser5.pl articles.xml

 

 

 

7) Applications

 

 

Application 1 :

 

 

----------> programme addOneID.pl

 

# Usage: perl addOneID.pl article.xml

 

use XML::Parser;

 

my $id = 'Balise001';

my $doc = shift;

 

$parser = new XML::Parser(ErrorContext => 2,

                          Handlers     => {Start => \&start,

                                           End   => \&end,

                                           Char  => \&char});

$parser->parsefile($doc);

 

###

sub escape {

my $str = shift;

$str =~ s/&/\&amp;/g;

$str =~ s/</\&lt;/g;

$str =~ s/>/\&gt;/g;

$str =~ s/'/\&apos;/g;

return $str;

}

 

sub char {print escape($_[1]);}

 

sub end {my $xp = shift; print $xp->recognized_string;}

 

sub start {

my $xp = shift;

my $str = $xp->recognized_string;

$str =~ s/>$/ id="$id">/;

print $str;

$id++;

}

 

 

 

---------> programme : articles.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

--------> résultat sous MS-DOS

Le programme addOneID.pl insère un attribut ID (unique) à toutes les balises ouvertes du document articles.xml

 

C:\>perl addOneID.pl articles.xml

<DICTIONNAIRE id="Balise001">

  <head id="Balise002">

    <title id="Balise003">Petit Dictionnaire</title>

    <where id="Balise004">ILPGA TAL P3 2001</where>

    <author id="Balise005">S. Fleury</author>

    <org id="Balise006">ILPGA P3</org>

  </head>

   <ARTICLE id="Balise007">

      <FORME id="Balise008">bidingue</FORME>

      <GRAMMAIRE id="Balise009">

         <CATEGORIE id="Balise010">n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE id="Balise011">de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION id="Balise012">

         <DEFINITION id="Balise013">qui d+®lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION id="Balise014">

         <DEFINITION id="Balise015">bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE id="Balise016">

      <FORME id="Balise017">cafardeux</FORME>

      <GRAMMAIRE id="Balise018">

         <CATEGORIE id="Balise019">adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE id="Balise020">de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION id="Balise021">

         <DEFINITION id="Balise022">couple qui s&apos;ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

C:\>

 

 

Application 2 :

 

# Programme qui remplace un nom d'une balise dans le document XML traité par un nouveau nom

 

 

---------------> Programme renameTAGNAME.pl

 

# Usage: perl renameTAGNAME.pl articles.xml head en-tete title titre

 

use XML::Parser;

 

my $doc = shift;

 

die "Uneven supply of tags" if (int(@ARGV) & 1);

%map = @ARGV;

 

$parser = new XML::Parser(ErrorContext => 2,

                                                  Handlers     => {Start => \&start,

                                                                                   End   => \&end,

                                                                                   Char  => \&char});

$parser->parsefile($doc);

 

####

sub escape {

  my $str = shift;

  $str =~ s/&/\&amp;/g;

  $str =~ s/</\&lt;/g;

  $str =~ s/>/\&gt;/g;

  $str =~ s/'/\&apos;/g;

  return $str;

}

 

sub char {

  my ($xp, $txt) = @_;

  print escape($txt);

}

 

sub start {

  my $xp = shift;

  my $el = shift;

  $el = $map{$el} if defined $map{$el};

  print "<$el";

  while (@_) {

    print " ", shift, "='", escape(shift), "'";

  }

  print ">";

}

 

sub end {

  my $xp = shift;

  my $el = shift;

  $el = $map{$el} if defined $map{$el};

  print "</$el>";

}

 

 

 

 

---------------> Programme articles.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

-------> Résultat sous MS-DOS

 

C:\>perl renameTAGNAME.pl articles.xml DICTIONNAIRE DICO_M.Stachura head En_tete

 title titre where lieu author Auteur

<DICO_M.Stachura>

  <En_tete>

    <titre>Petit Dictionnaire</titre>

    <lieu>ILPGA TAL P3 2001</lieu>

    <Auteur>S. Fleury</Auteur>

    <org>ILPGA P3</org>

  </En_tete>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d+®lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s&apos;ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICO_M.Stachura>

C:\>

 

 

 

 

Application 3 :

 

# Ce programme utilise le module XML::Parser qui réalise une convertion .HTML en fichier article.xml

 

      

 

-------------> programme articles2HTML.pl

 

# Usage : perl articles2HTML.pl articles.xml

 

%startsub = (

"head"         =>      "<hr><body bgcolor='#EEEEEE'><p>",

"title"        =>      "<h1><font color='#FF0066'>",

"author"       =>      "<h4><font color='#FF9999'>",

"where"        =>      "<h4><font color='#FF6666'>",

"org"          =>      "<h4><font color='#FFCCCC'>",

"ARTICLE"      =>      "<hr><p>",

"FORME"        =>      "<h2><font color='#669900'>FORME : ",

"GRAMMAIRE"    =>      "<br><font color='#66CC00'><b>Grammaire:</b>",

"CATEGORIE"    =>      "<ul><font color='#66CC66'><b>Categorie:</b><i> ",

"ETYMOLOGIE"   =>      "<br><ul><font color='#66CC99'><b>Etymologie:</b><i> ",

"ACCEPTION"    =>      "<br><font color='#66CCCC'><b>Acception:</b>",

"DEFINITION"   =>      "<ul><font color='#66CCFF'><b>Definition:</b>  "

);

 

%endsub = (

"head"        =>      "<br>",

"author"      =>      "</h4>",

"title"       =>      "</h1>",

"where"       =>      "</h4>",

"org"         =>      "</h4>",

"ARTICLE"     =>      "",

"FORME"       =>      "</h2>",

"GRAMMAIRE"   =>      "",

"CATEGORIE"   =>      "</i></ul>",

"ETYMOLOGIE"  =>      "</i></ul>",

"ACCEPTION"   =>      "",

"DEFINITION"  =>      "</ul>"

);

 

# ---------------------------------------------

 

use XML::Parser;

my $file = shift;

my $parser = new XML::Parser(ErrorContext => 2);

$parser->setHandlers(Start => \&start_handler,

                     End   => \&end_handler,

                                     Char  => \&char_handler);

 

print "<html>\n<body>\n";

$parser->parsefile($file);

print "\n</body>\n</html>\n";

 

# ---------------------------------------------

 

 

# The handlers for the XML Parser.

 

sub start_handler

{

    my $expat = shift; my $element = shift;

    # element is the name of the tag

    print $startsub{$element};

    # Handle the attributes

    while (@_) {

                my $att = shift;

                my $val = shift;

                print "$att=$val ";

    }

}

 

sub end_handler

{

    my $expat = shift; my $element = shift;

    print $endsub{$element};

}

 

 

sub char_handler

{

    my ($p, $data) = @_;

    print $data;

}

 

 

 

---------> programme : articles.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

 

----------> Résultat sous MS-DOS

 

C:\>perl articles2HTML.pl articles.xml

<html>

<body>

 

  <hr><body bgcolor='#EEEEEE'><p>

    <h1><font color='#FF0066'>Petit Dictionnaire</h1>

    <h4><font color='#FF6666'>ILPGA TAL P3 2001</h4>

    <h4><font color='#FF9999'>S. Fleury</h4>

    <h4><font color='#FFCCCC'>ILPGA P3</h4>

  <br>

   <hr><p>

      <h2><font color='#669900'>FORME : bidingue</h2>

      <br><font color='#66CC00'><b>Grammaire:</b>

         <ul><font color='#66CC66'><b>Categorie:</b><i> n. et adj.,</i></ul>

 

      <br><ul><font color='#66CC99'><b>Etymologie:</b><i> de bilingue et de ding

ue</i></ul>

      <br><font color='#66CCCC'><b>Acception:</b>

         <ul><font color='#66CCFF'><b>Definition:</b>  qui d+®lire en deux langu

es</ul>

 

      <br><font color='#66CCCC'><b>Acception:</b>

         <ul><font color='#66CCFF'><b>Definition:</b>  bilingue fou.</ul>

 

 

   <hr><p>

      <h2><font color='#669900'>FORME : cafardeux</h2>

      <br><font color='#66CC00'><b>Grammaire:</b>

         <ul><font color='#66CC66'><b>Categorie:</b><i> adjectif</i></ul>

 

      <br><ul><font color='#66CC99'><b>Etymologie:</b><i> de cafard et de deux</

i></ul>

      <br><font color='#66CCCC'><b>Acception:</b>

         <ul><font color='#66CCFF'><b>Definition:</b>  couple qui s'ennuie</ul>

 

 

 

</body>

</html>

 

C:\>

 

 

----->Résultat 2 sous MS-DOS

 

C:\>perl articles2HTML.pl articles.xml>articles.html

 

C:\>

 

 

 

-------->Programme articles.html

----------> résultat de parsage fichier html en sortie

                                                                               

Petit Dictionnaire

ILPGA TAL P3 2001

S. Fleury

ILPGA P3

 

FORME : bidingue


Grammaire:

Categorie: n. et adj.,

 

Etymologie: de bilingue et de dingue


Acception:

Definition: qui délire en deux langues


Acception:

Definition: bilingue fou.

 

FORME : cafardeux


Grammaire:

Categorie: adjectif

 

Etymologie: de cafard et de deux


Acception:

Definition: couple qui s'ennuie

 

 

 

 

Application 4 :

 

 

 

------------> Programme articles2HTML-2.pl appliqué sur articles.xml

 

# Usage : perl articles2HTML-2.pl articles.xml

 

use XML::Parser;

my $file = shift;

my $parser = new XML::Parser(Style=>'Subs', Pkg=>'SubHandlers', ErrorContext => 2);

$parser->setHandlers(Char  => \&char_handler);

print "<html>\n</head>\n";

$parser->parsefile($file);

print "\n</body>\n</html>\n";

 

# ---------------------------------------------

sub char_handler

{

    my ($p, $data) = @_;

    print $data;

}

# ---------------------------------------------

 

package SubHandlers;

sub DICTIONNAIRE {

  print "<title>Dictionnaire 2002 - M.Stachura</title>\n</head>";

  print "<BODY BGCOLOR=\"#EEEEEE \" LINK=\"#0000ff\" ALINK=\"#ff0000\" TEXT=\"maroon\">";

}

sub DICTIONNAIRE_ {

  print "</BODY>";

}

sub head {

    print "<table width=30%>\n"; # table --> un tableau avec une grille

}

sub author { 

    print "<tr><td><b><font color='#FF9999'>AUTEUR :</b></td><td>"; # tr --> determine les lignes du tableau

}

sub title { 

    print "<tr><td><b><font color='#FF0066'>TITRE :</b></td><td>"; # td --> determine les contenus des cellules

}

sub where { 

    print "<tr><td><b><font color='#FF6666'>LABO :</b></td><td>";

}

sub org { 

    print "<tr><td><b><font color='#FFCCCC'>ORG :</b></td><td>";

}

sub head_ {

    print "\n</table>\n<hr>\n";

}

sub author_ {

    print "</td></tr>";

}

sub title_ {

    print "</td></tr>";

}

sub where_ {

    print "</td></tr>";

}

sub org_ {

    print "</td></tr>";

}

sub ARTICLE {

  print "<td><br><table  width=\"45%\">\n</td>";

}

sub  ARTICLE_ {

  print "\n</table>\n";

}

sub FORME {

  print "<tr><td  align=\"left\"><b><font color='#669900'>FORME :</b></td><td>";

}

sub  FORME_ {

  print "</td></tr>";

}

sub GRAMMAIRE {

  print "<tr><td  align=\"left\"><b><font color='#66CC00'>GRAMMAIRE ></b></td><td>";

}

sub  GRAMMAIRE_ {

  print "</td></tr>";

} 

sub CATEGORIE {

  print "<b><font color='#66CC66'>CATEGORIE : </b>";

}

sub  CATEGORIE_ {

  print "";

} 

sub ETYMOLOGIE {

  print "<tr><td  align=\"left\"><b><font color='#66CC99'>ETYMOLOGIE :</b></td><td>";

}

sub  ETYMOLOGIE_ {

  print "</td></tr>";

}

sub ACCEPTION {

  print "<tr><td  align=\"left\"><b><font color='#66CCCC'>ACCEPTION ></b></td><td>";

}

sub  ACCEPTION_ {

  print "</td></tr>";

} 

sub DEFINITION {

  print "<b><font color='#66CCFF'>DEFINITION : </b>";

}

sub  DEFINITION_ {

  print "";

} 

 

  

 

---------> programme : articles.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

    <title>Petit Dictionnaire</title>

    <where>ILPGA TAL P3 2001</where>

    <author>S. Fleury</author>

    <org>ILPGA P3</org>

  </head>

   <ARTICLE>

      <FORME>bidingue</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n. et adj.,</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de bilingue et de dingue</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>qui d&#233;lire en deux langues</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

         <DEFINITION>bilingue fou.</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>cafardeux</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adjectif</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de cafard et de deux</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>couple qui s'ennuie</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

 

----->Résultat sous MS-DOS

 

C:\>perl articles2HTML.pl articles.xml>>articles2HTML-2.html

 

....../......

 

  <table width=30%>

 

    <tr><td><b><font color='#FF0066'>TITRE :</b></td><td>Petit Dictionnaire</td>

</tr>

    <tr><td><b><font color='#FF6666'>LABO :</b></td><td>ILPGA TAL P3 2001</td></

tr>

    <tr><td><b><font color='#FF9999'>AUTEUR :</b></td><td>S. Fleury</td></tr>

    <tr><td><b><font color='#FFCCCC'>ORG :</b></td><td>ILPGA P3</td></tr>

 

</table>

<hr>

 

   <td><br><table  width="45%">

</td>

      <tr><td  align="left"><b><font color='#669900'>FORME :</b></td><td>bidingu

e</td></tr>

      <tr><td  align="left"><b><font color='#66CC00'>GRAMMAIRE ></b></td><td>

         <b><font color='#66CC66'>CATEGORIE : </b>n. et adj.,

      </td></tr>

      <tr><td  align="left"><b><font color='#66CC99'>ETYMOLOGIE :</b></td><td>de

 bilingue et de dingue</td></tr>

      <tr><td  align="left"><b><font color='#66CCCC'>ACCEPTION ></b></td><td>

         <b><font color='#66CCFF'>DEFINITION : </b>qui d+®lire en deux langues

      </td></tr>

      <tr><td  align="left"><b><font color='#66CCCC'>ACCEPTION ></b></td><td>

         <b><font color='#66CCFF'>DEFINITION : </b>bilingue fou.

      </td></tr>

 

</table>

 

   <td><br><table  width="45%">

</td>

      <tr><td  align="left"><b><font color='#669900'>FORME :</b></td><td>cafarde

ux</td></tr>

      <tr><td  align="left"><b><font color='#66CC00'>GRAMMAIRE ></b></td><td>

         <b><font color='#66CC66'>CATEGORIE : </b>adjectif

      </td></tr>

      <tr><td  align="left"><b><font color='#66CC99'>ETYMOLOGIE :</b></td><td>de

 cafard et de deux</td></tr>

      <tr><td  align="left"><b><font color='#66CCCC'>ACCEPTION ></b></td><td>

         <b><font color='#66CCFF'>DEFINITION : </b>couple qui s'ennuie

      </td></tr>

 

</table>

 

</BODY>

</body>

</html>

 

C:\>

 

 

 

----->Résultat 2 sous MS-DOS

 

C:\>perl articles2HTML-2.pl articles.xml>articles2HTML-2.html

 

C:\>

 

 

 

 ----------> Programme articles2HTML-2.html

-----------> Résultat de parsage sous MS-DOS en sortie fichier html

 

 

TITRE :

Petit Dictionnaire

LABO :

ILPGA TAL P3 2001

AUTEUR :

S. Fleury

ORG :

ILPGA P3

 

 

 

FORME :

bidingue

GRAMMAIRE >

CATEGORIE : n. et adj.,

ETYMOLOGIE :

de bilingue et de dingue

ACCEPTION >

DEFINITION : qui délire en deux langues

ACCEPTION >

DEFINITION : bilingue fou.

 

 

 

FORME :

cafardeux

GRAMMAIRE >

CATEGORIE : adjectif

ETYMOLOGIE :

de cafard et de deux

ACCEPTION >

DEFINITION : couple qui s'ennuie

 

 

8) Projet

 

Convertir un document XML en HTML

 ( voir lien Dico2002.html )

 

 

10) XML:: XPath

 

 

----------------------------------->useXMLXpath.pl

XML:: XPath module qui permet la manipulation de xml offrant l'accès aux élements attribut, dtd...

 

 

#!/usr/bin/perl -w

#use strict;

 

$| = 1;

 

unless (@ARGV >= 1) {

                print  qq(Usage:

$0 [filename] query

                                                               

                If no filename is given, supply XML on STDIN.

);

                exit;

}

 

use XML::XPath;

 

my $xpath;

 

my $pipeline;

 

if ($ARGV[0] eq '-p') {

                # pipeline mode

                $pipeline = 1;

                shift @ARGV;

}

if (@ARGV >= 2) {

                $xpath = XML::XPath->new(filename => shift(@ARGV));

}

else {

                $xpath = XML::XPath->new(ioref => \*STDIN);

}

 

my $nodes = $xpath->find(shift @ARGV);

 

unless ($nodes->isa('XML::XPath::NodeSet')) {

NOTNODES:

                print  "Query didn't return a nodeset. Value: ";

                print $nodes->value, "\n";

                exit;

}

 

if ($pipeline) {

                $nodes = find_more($nodes);

                goto NOTNODES unless $nodes->isa('XML::XPath::NodeSet');

}

 

if ($nodes->size) {

                print "Found ", $nodes->size, " nodes:\n";

                foreach my $node ($nodes->get_nodelist) {

                                print  "\n---ooo---   NODE   ---ooo---\n\n";

                                print  $node->toString;

                                print "\n";

                }

}

else {

                print  "No nodes found";

}

 

print  "\n";

 

exit;

 

sub find_more {

                my ($nodes) = @_;

                if (!@ARGV) {

                                return $nodes;

                }

               

                my $newnodes = XML::XPath::NodeSet->new;

               

                my $find = shift @ARGV;

               

                foreach my $node ($nodes->get_nodelist) {

                                my $new = $xpath->find($find, $node);

                                if ($new->isa('XML::XPath::NodeSet')) {

                                                $newnodes->append($new);

                                }

                                else {

                                                warn "Not a nodeset: ", $new->value, "\n";

                                }

                }

               

                return find_more($newnodes);

}

 

 

 

-------------------------------------------> artperso_ms.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

 

    <title>Journal</title>

    <where>ILPGA TAL P3 2002</where>

    <author>M. Stachura</author>

    <org>Asso Perso</org>

  </head>

   <ARTICLE>

      <FORME>convaincu</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adj.</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de con et de vaincu</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>idiot qui a subi une defaite</DEFINITION>

      </ACCEPTION>

    </ARTICLE>

  <ARTICLE>

      <FORME>aye-aye</FORME>

      <GRAMMAIRE>

             <CATEGORIE>n.</CATEGORIE>

     </GRAMMAIRE>

     <ETYMOLOGIE>de aie et de aie</ETYMOLOGIE>

      <ACCEPTION>

             <DEFINITION>personne qui souffre</DEFINITION>

      </ACCEPTION>

  </ARTICLE>

  <ARTICLE>

      <FORME>fermenter</FORME>

      <GRAMMAIRE>

         <CATEGORIE>verbe</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de ferme et de mentir</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>dire un mensonge</DEFINITION>

      </ACCEPTION>

  </ARTICLE>

  <ARTICLE>

      <FORME>apiquer</FORME>

      <GRAMMAIRE>

         <CATEGORIE>verbe</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de appliqer et de piquer</ETYMOLOGIE>

      <ACCEPTION>

        <DEFINITION>executer un pique en avion</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>chaloupe</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n.f</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de chat et de loupe</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>loupe en forme de chat</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

               <DEFINITION>un chat qui est rate</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

----------> Résultat sous MS-DOS

 

C:\GOSIA\perloo\PerlXml>perl useXmlXpath.pl artperso_ms.xml "DICTIONNAIRE/ARTICL

ES/FORME"

Found 5 nodes:

 

---ooo---   NODE   ---ooo---

 

<FORME>convaincu</FORME>

 

---ooo---   NODE   ---ooo---

 

<FORME>aye-aye</FORME>

 

---ooo---   NODE   ---ooo---

 

<FORME>fermenter</FORME>

 

---ooo---   NODE   ---ooo---

 

<FORME>apiquer</FORME>

 

---ooo---   NODE   ---ooo---

 

<FORME>chaloupe</FORME>

 

 

 

11.1XML:: DOM 

 

 

------------> Programme useXMLDom.pl appliqué sur artperso_ms.xml

C' est un module de manipulation de doduments XML sous forme d'arbre, offrant l'accès aux éléments, attributs, DTD ...

 

use strict;

use XML::DOM;

 

my $p = XML::DOM::Parser->new;

my $doc = $p->parsefile(shift);

 

my $level = 0;

process_node($doc->getFirstChild);

 

sub process_node {

  my ($node) = @_;

  my $ind = ' ' x $level;

  my $nodeType = $node->getNodeType;

  print "Node Type => ", $nodeType,"\n";

  if ($nodeType == ELEMENT_NODE) {

    my $type = $node->getTagName;

    my $attrs = $node->getAttributes;

 

    print $ind, $type, ' [';

    my @attrs;

    foreach (0 .. $attrs->getLength - 1) {

      my $attr = $attrs->item($_);

      push @attrs, $attr->getNodeName . ': ' . $attr->getValue;

    }

    print join (', ', @attrs);

    print "]\n";

 

    my $nodelist = $node->getChildNodes;

    ++$level;

    for (0 .. $nodelist->getLength - 1) {

      process_node($nodelist->item($_));

    } --$level;

  } elsif ($nodeType == TEXT_NODE) {

    my $content = $node->getData;

    $content =~ s/\n/ /g;

    $content =~ s/^\s+//;

    $content =~ s/\s+$//;

    print $ind, $content, "\n" if $content =~ /\S/;

  }

}

 

----------->  Programme artperso_ms.xml

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<DICTIONNAIRE>

  <head>

 

    <title>Journal</title>

    <where>ILPGA TAL P3 2002</where>

    <author>M. Stachura</author>

    <org>Asso Perso</org>

  </head>

   <ARTICLE>

      <FORME>convaincu</FORME>

      <GRAMMAIRE>

         <CATEGORIE>adj.</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de con et de vaincu</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>idiot qui a subi une defaite</DEFINITION>

      </ACCEPTION>

    </ARTICLE>

  <ARTICLE>

      <FORME>aye-aye</FORME>

      <GRAMMAIRE>

             <CATEGORIE>n.</CATEGORIE>

     </GRAMMAIRE>

     <ETYMOLOGIE>de aie et de aie</ETYMOLOGIE>

      <ACCEPTION>

             <DEFINITION>personne qui souffre</DEFINITION>

      </ACCEPTION>

  </ARTICLE>

  <ARTICLE>

      <FORME>fermenter</FORME>

      <GRAMMAIRE>

         <CATEGORIE>verbe</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de ferme et de mentir</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>dire un mensonge</DEFINITION>

      </ACCEPTION>

  </ARTICLE>

  <ARTICLE>

      <FORME>apiquer</FORME>

      <GRAMMAIRE>

         <CATEGORIE>verbe</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de appliqer et de piquer</ETYMOLOGIE>

      <ACCEPTION>

        <DEFINITION>executer un pique en avion</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

   <ARTICLE>

      <FORME>chaloupe</FORME>

      <GRAMMAIRE>

         <CATEGORIE>n.f</CATEGORIE>

      </GRAMMAIRE>

      <ETYMOLOGIE>de chat et de loupe</ETYMOLOGIE>

      <ACCEPTION>

         <DEFINITION>loupe en forme de chat</DEFINITION>

      </ACCEPTION>

      <ACCEPTION>

               <DEFINITION>un chat qui est rate</DEFINITION>

      </ACCEPTION>

   </ARTICLE>

</DICTIONNAIRE>

 

 

 

---------->  Résultat sous MS-DOS

 

 

 

resu.txt

 

Node Type => 1

DICTIONNAIRE []

Node Type => 3

Node Type => 1

 head []

Node Type => 3

Node Type => 1

  title []

Node Type => 3

   Journal

Node Type => 3

Node Type => 1

  where []

Node Type => 3

   ILPGA TAL P3 2002

Node Type => 3

Node Type => 1

  author []

Node Type => 3

   M. Stachura

Node Type => 3

Node Type => 1

  org []

Node Type => 3

   Asso Perso

Node Type => 3

Node Type => 3

Node Type => 1

 ARTICLE []

Node Type => 3

Node Type => 1

  FORME []

Node Type => 3

   convaincu

Node Type => 3

Node Type => 1

  GRAMMAIRE []

Node Type => 3

Node Type => 1

   CATEGORIE []

Node Type => 3

    adj.

Node Type => 3

Node Type => 3

Node Type => 1

  ETYMOLOGIE []

Node Type => 3

   de con et de vaincu

Node Type => 3

Node Type => 1

  ACCEPTION []

Node Type => 3

Node Type => 1

   DEFINITION []

Node Type => 3

    idiot qui a subi une defaite

Node Type => 3

Node Type => 3

Node Type => 3

Node Type => 1

 ARTICLE []

Node Type => 3

Node Type => 1

  FORME []

Node Type => 3

   aye-aye

Node Type => 3

Node Type => 1


Retour au Perl et XML - Maitrise Tal 2002