Extraire des données d'un fichier xml
na_ba85
Messages postés
8
Statut
Membre
-
[Dal] Messages postés 6373 Statut Contributeur -
[Dal] Messages postés 6373 Statut Contributeur -
Bonjour,
J'essaye de parser un fichier xml et de recuperer certaines données.
Mon fichier xml est de ce type :
<?xml version="1.0" encoding="UTF-8" ?>
<voiture>
<info count="-1" ended="1376903248" name="A" started="1376903248" status="OK" statusMsg="" />
<info count="-1" ended="1376903275" name="B" started="1376903248" status="OK" statusMsg="" />
...
</voiture>
Je dois extraire pour 'name=B' :
- la valeur de {ended} et {started} => diff = {ended} - {started}
- le {status}
J'ai regardé ce lien :
https://metacpan.org/
Mais je suis perdue avec tous les types de module que je peux utiliser :(
XML::LibXML
XML::Parser
XML::Simple
Dans mon cas, je pense utiliser :
use strict;
use warnings;
use File::Path;
.....
use XML::LibXML::Parser;
my $OUTDIR="$home";
my $OUTFILE="file.xml";
my $parser;
my $doc;
$parser = new XML::Parser();
$doc = $parser->parsefile ($OUTFILE);
# load
open my $fh, '<', 'file.xml';
$doc = XML::LibXML->load_xml(IO => $fh);
Là je bloque pour lui faire comprendre dans la balise voiture, attribut name = B, je recupere {ended},{started},{status}.
J'ai essayé de regarder sur internet, je suis perdue avec toutes les infos.
Si vous pouvez me donner plus d'explication ou des conseils, ça m'aiderait enormement :)
Je vous remercie d'avance.
Cdt,
Naba
J'essaye de parser un fichier xml et de recuperer certaines données.
Mon fichier xml est de ce type :
<?xml version="1.0" encoding="UTF-8" ?>
<voiture>
<info count="-1" ended="1376903248" name="A" started="1376903248" status="OK" statusMsg="" />
<info count="-1" ended="1376903275" name="B" started="1376903248" status="OK" statusMsg="" />
...
</voiture>
Je dois extraire pour 'name=B' :
- la valeur de {ended} et {started} => diff = {ended} - {started}
- le {status}
J'ai regardé ce lien :
https://metacpan.org/
Mais je suis perdue avec tous les types de module que je peux utiliser :(
XML::LibXML
XML::Parser
XML::Simple
Dans mon cas, je pense utiliser :
use strict;
use warnings;
use File::Path;
.....
use XML::LibXML::Parser;
my $OUTDIR="$home";
my $OUTFILE="file.xml";
my $parser;
my $doc;
$parser = new XML::Parser();
$doc = $parser->parsefile ($OUTFILE);
# load
open my $fh, '<', 'file.xml';
$doc = XML::LibXML->load_xml(IO => $fh);
Là je bloque pour lui faire comprendre dans la balise voiture, attribut name = B, je recupere {ended},{started},{status}.
J'ai essayé de regarder sur internet, je suis perdue avec toutes les infos.
Si vous pouvez me donner plus d'explication ou des conseils, ça m'aiderait enormement :)
Je vous remercie d'avance.
Cdt,
Naba
A voir également:
- Extraire données xml dans excel
- Liste déroulante excel - Guide
- Extraire une video youtube - Guide
- Trier des données excel - Guide
- Extraire le son d'une vidéo - Guide
- Xml viewer - Télécharger - Édition & Programmation
1 réponse
Salut na_ba85,
Si ta recherche est aussi simple, et que les données XML dans chaque balise "info" tiennent sur une ligne, tu peux utiliser une regexp pour faire cela et éviter de t'embêter avec un module.
donne :
La regexp utilise le modificateur "m" pour que le marqueur de début de ligne soit appliqué à chaque ligne, et on suppose que le contenu de "status" est en lettres majuscules.
Dal
Si ta recherche est aussi simple, et que les données XML dans chaque balise "info" tiennent sur une ligne, tu peux utiliser une regexp pour faire cela et éviter de t'embêter avec un module.
#!/usr/bin/perl
use strict;
use warnings;
$_ = q(<?xml version="1.0" encoding="UTF-8" ?>
<voiture>
<info count="-1" ended="1376903248" name="A" started="1376903248" status="OK" statusMsg="" />
<info count="-1" ended="1376903275" name="B" started="1376903248" status="OK" statusMsg="" />
...
</voiture>);
if (/^<info.*ended="([0-9]+)" name="B" started="([0-9]+)" status="([A-Z]+)"/m)
{
print "match found:\n\nended=$1 - started=$2 - status=$3\n";
}
donne :
match found: ended=1376903275 - started=1376903248 - status=OK
La regexp utilise le modificateur "m" pour que le marqueur de début de ligne soit appliqué à chaque ligne, et on suppose que le contenu de "status" est en lettres majuscules.
Dal