Ne connaissant pas perl, et malgré les quelques infos glanée sur google, je patauge
J’ai un fichier xml online mis à jour en live contenant les titres des morceaux qui passent sur un stream
Ce fichier xml contient le titre en cours (happening), et les 4 précédents(happened).
Le fichier est de la forme :
<Schedule>
<Event status="happening" startTime="xx:xx:xx" eventType="song">
<s:Song title="MON TITRE 1">
<s:Artist name="MON ARTIST 1">
<m:Media runTime="xxx.xx"/>
</s:Artist>
</s:Song>
</Event>
<Event status="happened" startTime="xx:xx:xx" eventType="song">
<s:Song title="MON TITRE 2">
<s:Artist name="MON ARTIST 2">
<m:Media runTime="xxx.xx"/>
</s:Artist>
</s:Song>
</Event>
...
</Schedule>
le but est de récupérer le titre et l’artiste du morceau en cours, et lui uniquement.
voila le code que j’ai actuellement :
#! /usr/bin/perl
use LWP::Simple;
$url = "http://stream_xml_url/fichier.xml";
while (1)
{
my $content = get $url;
if ($content =~ m/status="happening" startTime=".*" eventType="song"><s:Song title="(.*)"><s:Artist name="(.*)">/i)
{
$string = join '', map { ucfirst lc } split /(\s+)/, $2;
print "En cours : $1 ($string)\n"
}
sleep (5);
}
le hic est qu’il ne récupère non pas les infos du morceau en status “happening”, mais les infos du morceau le plus vieux (le dernier dans le xml)
Ton problème vient certainement du fait que les expressions régulières perl sont “greedy” par défaut. Bascule tous tes .* en “lazy” .*? ou bien, ce que personnellement je trouve plus clair, en classes de caractères inversées [^"]*
Le mieux ça reste quand même d’utiliser un vrai parser XML (SAX ou DOM). Bricoler du XML à coup d’expressions régulières c’est jamais terrible et tu t’exposes à toutes sortes d’ennuis que les parsers savent traiter, eux (encodage du fichier, vérification de la structure, décodage des entités, ordre des attributs qui n’a aucune importance, caractères blancs, j’en passe et des meilleurs…).
J’aime bien me torturer l’esprit à coup de regexp (même si je hais les regexp) et faire moi-même mes mini « parser »
ok je réinvente la roue, mais vu que c’est pour usage perso et apprentissage perso, au moins j’apprends bien mieux…
…et faire bosser un peu ses neurones ne fait pas de mal
[quote=« syam »]Ton problème vient certainement du fait que les expressions régulières perl sont « greedy » par défaut. Bascule tous tes .* en « lazy » .*? ou bien, ce que personnellement je trouve plus clair, en classes de caractères inversées [^"]*