Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

XML::Reader

2 réponses
Avatar
Klaus
Bonjour,

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);

$dmp =3D~ s{\s}''xmsg;
$dmp =3D~ s{\$VAR1=3D}''xms;

printf "<dt2> %3d. %s\n", $i, $dmp;
}
print "\n";

}

{
my $rdr =3D XML::Reader->newhd(\$content,
{ filter =3D> 5 },
{ root =3D> '//a', branch =3D> ['/', '/@href'] },
) or die "Error-0040: Can't X::R->new() because $!";

my $i;
while ($rdr->iterate) {
my ($text, $href) =3D $rdr->rval;
next unless defined $href;

my $stem =3D $rdr->rstem;

$i++;
for ($text, $href) {
$_ =3D '' unless defined $_;
}

printf "<a> %3d. %-35s: %-18.18s href=3D%s\n",
$i, $stem, $text, $href;
}
print "\n";

}

{
my $rdr =3D XML::Reader->newhd(\$content,
{ filter =3D> 5 },
{ root =3D> '//img',
branch =3D> ['/@src', '/@height', '/@width'] },
) or die "Error-0040: Can't X::R->new() because $!";

my $i;
while ($rdr->iterate) {
my ($src, $height, $width) =3D $rdr->rval;

$i++;
for ($src, $height, $width) {
$_ =3D '' unless defined $_;
}

printf "<img> %3d. src=3D%-40s h=3D%-4s w=3D%s\n",
$i, $src, $height, $width;
}
print "\n";

}

...et voici une partie du r=E9sultat:

reading http://www.w3.org/TR/xhtml1...
[...]
<dt1> 20. <dt><code class=3D'tag'>a</code></dt>
<dt1> 21. <dt><code class=3D'tag'>pre</code></dt>
<dt1> 22. <dt><code class=3D'tag'>button</code></dt>
<dt1> 23. <dt><code class=3D'tag'>label</code></dt>
[...]
<dt2> 20. {'code'=3D>{'content'=3D>'a','class'=3D>'tag'}};
<dt2> 21. {'code'=3D>{'content'=3D>'pre','class'=3D>'tag'}};
<dt2> 22. {'code'=3D>{'content'=3D>'button','class'=3D>'tag'}};
<dt2> 23. {'code'=3D>{'content'=3D>'label','class'=3D>'tag'}};
[...]
<a> 43. /html/body/div/ul/li/a : Acknowledgements
href=3D#acks
<a> 44. /html/body/div/ul/li/a : References
href=3D#refs
<a> 45. /html/body/div/ul/li/a : What is XHTML?
href=3D#xhtml
<a> 46. /html/body/div/ul/li/ul/li/a : What is HTML 4?
href=3D#html4
<a> 47. /html/body/div/ul/li/ul/li/a : What is XML?
href=3D#xml
[...]
<img> 1. src=3Dhttp://www.w3.org/Icons/w3c_home h=3D48 w=3D72
<img> 2. src=3Dhttp://www.w3.org/WAI/wcag1AAA.png h=3D32 w=3D88

2 réponses

Avatar
Klaus
On 27 avr, 21:29, Klaus wrote:
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



J'ai publié une nouvelle version 0.35 de XML::Reader avec une nouvelle
licence, des corrections de bugs et une interface plus simple:

http://search.cpan.org/~keichner/XML-Reader-0.35/lib/XML/Reader_fr.pod

  my $rdr = XML::Reader->newhd($content, { filter => 5 },



Cette ligne s'écrit avec la nouvelle version 0.35 comme ci-dessous

my $rdr = XML::Reader->new($content, { filter => 'branches' },
Avatar
Klaus
On 30 avr, 14:07, Klaus wrote:
On 27 avr, 21:29, Klaus wrote:
Cette ligne s'écrit avec la nouvelle version 0.35 comme ci-dessous

my $rdr = XML::Reader->new($content, { filter => 'branches' },



Je suis bête, en version 0.35, il faut utiliser { mode => }, et non
pas {filter => }

my $rdr = XML::Reader->new($content, { mode => 'branches' },