Perl - analyse de fchier xml

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)

une idée ?

petit up

soit j’ai mal formulé/il manque une info, soit personne ne sait d’où vient mon bug :confused:

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 [^"]*

regular-expressions.info/repeat.html#greedy
regular-expressions.info/repeat.html#lazy

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…).

Écrire un vrai parseur me semble être assez bourin. Une simple (ou peut être deux) requête XPath devrait suffire.
Dès que j’ai le temps je regarde.

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 :stuck_out_tongue:

[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 [^"]*

regular-expressions.info/repeat.html#greedy
regular-expressions.info/repeat.html#lazy

[/quote]
impec ! c’était bien ça :023
merci bien, jvais pouvoir avancer et continuer dans mes expériences farfelues :shifty: