XML::Reader

27/04/2010 - 21:02 von Klaus | Report spam
Hallo,

Ich habe das Modul XML::Reader (ver 0.34) veröffentlicht:
http://search.cpan.org/~keichner/XML-Reader-0.34/lib/XML/Reader_de.pod

Um die Funktionsweise des Moduls zu erklàren habe ich ein kleines
Demonstrations Programm geschrieben welches (ohne dabei zuviel
Speicher zu benutzen) XML-Unterstrukturen extrahiert (z.B. Extraktion
aller Tags die mit '/.../a' enden).

XML Dokumente können unter Umstànden sehr gross werden (mehrere
Gigabytes), man will jedoch hàufig nur bestimmte XML-Unterstrukturen
lesen (und eine einzelne XML-Unterstruktur ist hàufig nicht sehr
gross, vielleicht einige Kilobytes). Das unten angegebene
Demonstrationsprogramm liest solche "XML-Unterstrukturen" sequentiell,
eine nach der anderen.

Speicher wird nur für jeweils eine XML-Unterstruktur gehalten. Jede
"XML-Unterstruktur" kann dann beliebig bearbeitet werden (z.B. mit
regulàren Ausdrücken, oder aber mit weiteren XML-Modulen Ihrer Wahl,
z.B. mit XML::Simple).

XML-Module (wie z.B. XML::Parser) sind hàufig Event gesteuert und
arbeiten mit sogenannten "callback-Funktionen". XML::Reader
funktioniert jedoch anders: Grundsàtzlich existieren in XML::Reader
keine Callback-Funktionen, anstelle dessen arbeitet man mit seiner
eigenen Schleife (..."while ($rdr->iterate)...") und man extrahiert
die einzelnen Elemente im Textformat durch die Funktion $rdr->rval.

Ich freue mich über jedwedige Fragen, Vorschlàge und Feedback !

Mein Demonstrationsprogramm beginnt hier:

use strict;
use warnings;
use XML::Reader 0.34;

use LWP::Simple;
use XML::Simple;
use Data::Dumper;

my $addr = 'http://www.w3.org/TR/xhtml1';

print "reading $addr...";
my $content = get $addr
or die "Error-0010: Can't get address '$addr'";

print "";

{
my $rdr = XML::Reader->newhd(\$content,
{ filter => 5 },
{ root => '/html/body/dl/dt', branch => '*' },
) or die "Error-0030: Can't X::R->new() because $!";

my $i;
while ($rdr->iterate) { $i++;
my $xml = $rdr->rval;

printf "<dt1> %3d. %s", $i, $xml;
}
print "";

}

{
my $rdr = XML::Reader->newhd(\$content,
{ filter => 5 },
{ root => '/html/body/dl/dt', branch => '*' },
) or die "Error-0020: Can't X::R->new() because $!";

my $i;
while ($rdr->iterate) { $i++;
my $xml = $rdr->rval;
my $ref = XMLin($xml);
my $dmp = Dumper($ref);

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

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

}

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

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

my $stem = $rdr->rstem;

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

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

}

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

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

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

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

}

Und das hier ist ein Auszug der Ausgabe des Programms:

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

Lesen sie die antworten

#1 Klaus
30/04/2010 - 14:10 | Warnen spam
On 27 avr, 21:02, Klaus wrote:
Ich habe das Modul XML::Reader (ver 0.34) veröffentlicht:
http://search.cpan.org/~keichner/XML-Reader-0.34/lib/XML/Reader_de.pod



Ich habe jetzt eine neue version 0.35 des Moduls XML::Reader
veröffentlicht mit einer neuen Lizenz, einigen Fehlerkorrekturen und
einem besseren Interface:

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

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



Diese Zeile schreibt sich jetzt mit der neuen Version 0.35 des Moduls
XML::Reader wie folgt:

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

Ähnliche fragen