je viens de publier le module XML::Reader, version 0.34:
http://search.cpan.org/~keichner/XML-Reader-0.34/lib/XML/Reader_fr.pod
Pour expliquer le fonctionnement du module XML::Reader, j'ai =E9crit un
programme
de "d=E9monstration" qui extrait (sans consommer beaucoup de m=E9moire)
des =E9l=E9ments XML
(par exemple extractions des =E9l=E9ments '/.../a').
Un document XML entier est souvent tr=E8s gros (plusieurs giga octets).
Par contre, une seule sous-structure XML
(l'unit=E9 de traitement XML) est souvent assez petit (quelques kilo
octets en g=E9n=E9ral). Le programme de "d=E9monstration" ci-dessous traite
des sous-structures XML, une apr=E8s l'autre.
La consommation m=E9moire est limit=E9 =E0 une sous-structure =E0 la fois.
Ensuite, pour traiter une telle sous-structure,
on peut utiliser des expressions r=E9guli=E8res (ou m=EAme des modules XML
de votre choix, comme par exemple XML::Simple).
Les modules XML classiques (comme par exemple XML::Parser) sont
souvent pilot=E9 par les =E9v=E9nements (ils utilisent des fonctions
"callback"). XML::Reader, par contre, n'utilise pas les =E9v=E9nements.
Avec XML::Reader, on travaille avec sa propre boucle (..."while ($rdr-
>iterate)...") et on r=E9cup=E8re les =E9l=E9ments XML par la fonction $rdr=
-
>rval.
Je serais content de recevoir vos questions, commentaires et
propositions !
Voici mon programme de "d=E9monstration":
use strict;
use warnings;
use XML::Reader 0.34;
use LWP::Simple;
use XML::Simple;
use Data::Dumper;
my $addr =3D 'http://www.w3.org/TR/xhtml1';
print "reading $addr...\n";
my $content =3D get $addr
or die "Error-0010: Can't get address '$addr'";
print "\n";
{
my $rdr =3D XML::Reader->newhd(\$content,
{ filter =3D> 5 },
{ root =3D> '/html/body/dl/dt', branch =3D> '*' },
) or die "Error-0030: Can't X::R->new() because $!";
my $i;
while ($rdr->iterate) { $i++;
my $xml =3D $rdr->rval;
printf "<dt1> %3d. %s\n", $i, $xml;
}
print "\n";
}
{
my $rdr =3D XML::Reader->newhd(\$content,
{ filter =3D> 5 },
{ root =3D> '/html/body/dl/dt', branch =3D> '*' },
) or die "Error-0020: Can't X::R->new() because $!";
my $i;
while ($rdr->iterate) { $i++;
my $xml =3D $rdr->rval;
my $ref =3D XMLin($xml);
my $dmp =3D Dumper($ref);