# Perl - analyse de fchier xml

**URL:** <https://www.debian-fr.org/t/perl-analyse-de-fchier-xml/52286>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 11:10 UTC](https://www.debian-fr.org/t/perl-analyse-de-fchier-xml/52286 "2016-02-21T11:10:54Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mitsu](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/f475e1/32.png) [@Mitsu](https://www.debian-fr.org/u/Mitsu)\
**Post date:** [Février 21, 2016, 11:10 UTC](https://www.debian-fr.org/t/perl-analyse-de-fchier-xml/52286/1 "2016-02-21T11:10:54Z")

</div>

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 :

```auto
<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 :

```auto
#! /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 ?

---

<div class="post-metadata">

**Author:** ![Mitsu](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/f475e1/32.png) [@Mitsu](https://www.debian-fr.org/u/Mitsu)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/perl-analyse-de-fchier-xml/52286/2 "2016-02-21T11:11:29Z")

</div>

petit up

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

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/perl-analyse-de-fchier-xml/52286/3 "2016-02-21T11:11:32Z")

</div>

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](http://www.regular-expressions.info/repeat.html#greedy)  
[regular-expressions.info/repeat.html#lazy](http://www.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…).

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/perl-analyse-de-fchier-xml/52286/4 "2016-02-21T11:11:34Z")

</div>

É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.

---

<div class="post-metadata">

**Author:** ![Mitsu](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/f475e1/32.png) [@Mitsu](https://www.debian-fr.org/u/Mitsu)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/perl-analyse-de-fchier-xml/52286/5 "2016-02-21T11:11:44Z")

</div>

J’aime bien me torturer l’esprit à coup de regexp (même si je hais les regexp) et faire moi-même mes mini «&nbsp;parser&nbsp;»  
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=«&nbsp;syam&nbsp;»]Ton problème vient certainement du fait que les expressions régulières perl sont «&nbsp;greedy&nbsp;» par défaut. Bascule tous tes .\* en «&nbsp;lazy&nbsp;» .\*? ou bien, ce que personnellement je trouve plus clair, en classes de caractères inversées [^"]\*

[regular-expressions.info/repeat.html#greedy](http://www.regular-expressions.info/repeat.html#greedy)  
[regular-expressions.info/repeat.html#lazy](http://www.regular-expressions.info/repeat.html#lazy)  
…  
[/quote]  
impec ! c’était bien ça ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")  
merci bien, jvais pouvoir avancer et continuer dans mes expériences farfelues ![:shifty:](https://www.debian-fr.org/uploads/default/original/1X/c2c6b2db4f768c7bf93cea265ed4e2c63ae01880.gif "Shifty")
