#!/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/<.+?>//g; #vire ce qui sert à rien
$var1=~s/<.+?>//g;
$var2=~s/&#39;/'/g; #remplace l'entité HTML de l'apostrophe
$var1=~s/&#39;/'/g;
$var2=~s/&#34;/"/g; #remplace l'entité HTML des guillemets
$var1=~s/&#34;/"/g;
return $var1, $var2 ;
}
#--------------------------------------------------------------------------------------