#!/usr/bin/perl use XML::RSS; #---------------------------------------- <<DOC; Votre Nom: MARIN Apolline Janvier 2018 usage: perl nomprogXML::RSS.pl rép-à-parcourir rubrique Le programme extrait les titres et les descriptions d'une rubrique donnée Il produit en sortie 2 fichiers structurés contenant sur chaque ligne le nom du fichier et le résultat du filtrage <PARCOURS><file>nom du fichier<items><item><article>contenu du filtrage></article></item><//items></file><PARCOURS> 1 fichier.txt avec les titres et les descriptions 1 fichier XML : mêmes infos structurées en XML DOC #----------------------------------------------------------- my $rep="$ARGV[0]"; my $rubrique="$ARGV[1]"; my %redondant; open(OUT1,">:encoding(utf-8)","xmlrss.txt"); open(OUT2,">:encoding(utf-8)","xmlrss.xml"); print OUT2 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"; print OUT2 "<PARCOURS rubrique=\"$rubrique\">\n"; &parcoursarborescencefichiers($rep); # on lance la récursion.... et elle se terminera après examen de toute l'arborescence print OUT2 "</PARCOURS>\n"; close(OUT2); close(OUT1); exit; #------------------------------------------------------------- sub parcoursarborescencefichiers { my $path = shift(@_); #on récupère le nom du repertoire opendir(DIR, $path) or die "can't open $path: $!\n"; #je l'ouvre my @files = readdir(DIR); #je fais l'inventaire du contenu de ce repertoire closedir(DIR); #je traite tout ce que contient mon répertoire foreach my $file (@files) { next if $file =~ /^\.\.?$/; #j'ignore le répertoire père, et le dossier lui-même $file = $path."/".$file; #je recréer leur chemin relatif complet par rapport au dossier d'où le prgm a été lancé} # si l'élément est un répertoire if (-d $file) { print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n"; &parcoursarborescencefichiers($file); #recurse! print "<FIN REPERTOIRE> ==> ",$file,"\n"; } # si l'élément est un fichier if (-f $file) { if ($file=~m/$rubrique.+\.xml$/) { #je ne traite que les fichiers XML print "<",$compteurfile++,"> ==> ",$file,"\n"; my $rss=new XML::RSS; eval {$rss->parsefile($file); }; #j'analyse le fichier RSS et remplace le contenu de $rss if( $@ ) { $@ =~ s/at \/.*?$//s; # remove module line number print STDERR "\nERROR in '$file':\n$@\n"; } else { print OUT2 "<file name=\"$file\">\n<items>\n"; foreach my $item (@{$rss->{'items'}}) { my $description=$item->{'description'}; my $titre=$item->{'title'}; ($titre,$description) = &nettoyage ($titre,$description); if (!(exists $dico{$titre})) { $dico{$titre} = 1; print OUT1 "Titre : $titre \n"; print OUT1 "Description : $description \n"; $compteurItem++; print OUT2 "<item number=\"$compteurItem\">\n<titre>$titre</titre>\n<description>$description</description>\n</item>\n"; } } print OUT2 "</items>\n</file>\n"; } } } } } #------------------------------------------------------------------------------------------------------------- sub nettoyage { # @_[1] liste créee automatiquement qui regroupe les arguments utilisés pour lancer un sous-prgm my $var1 = shift @_ ; my $var2 = shift @_ ; $var2=~s/&lt;.+?&gt;//g; #vire ce qui sert à rien $var1=~s/&lt;.+?&gt;//g; $var2=~s/&#38;#39;/'/g; #remplace l'entité HTML de l'apostrophe $var1=~s/&#38;#39;/'/g; $var2=~s/&#38;#34;/"/g; #remplace l'entité HTML des guillemets $var1=~s/&#38;#34;/"/g; return $var1, $var2 ; } #--------------------------------------------------------------------------------------