Ein Comic-Verzeichnis
(Auszug aus "Perl & XML" von Erik T. Ray & Jason McIntosh)
XSLT ist eine Sache, aber die Möglichkeiten der Zusammenarbeit von Perl, XML und dem Web sind nahezu unbegrenzt. Manchmal genügt es nicht, vorhandenes XML umzustellen und auszugeben. Vielleicht müssen die auszugebenden Informationen angereichert werden, vielleicht ist die durchzuführende Transformation zu komplex für XSLT oder vielleicht gibt es irgendwelche andere Gründe. Das vorige Beispiel enthielt schon einiges in dieser Richtung: Wir haben die Anwendung von XSLT zur Transformation eines DocBook-Dokuments mit der Erzeugung einer Indexseite vermischt.
Wir haben uns schon in RSS, SOAP und andere XML-Anwendungen mit dem Thema der Synchronisation von Informationen im Web beschäftigt. Damals ging es um RSS. In diesem Abschnitt möchten wir dasselbe für ComicsML durchführen. Wir schreiben ein einfaches CGI-Skript, das ein Verzeichnis der vom Benutzer bevorzugten Online-Comics erstellt. (In unserer Fantasie sind alle betreffenden Sites mit beschreibenden ComicsML-Dokumenten versehen.)
#!/usr/bin/perl
# Ein sehr einfaches Programm zur Bearbeitung von ComicsML-Dokumenten.
# Die Dokumente werden gelesen, die enthaltenen Strips in eine Liste eingefügt,
# und dann wird eine Webseite mit Links zu den betreffenden Comics ausgegeben.
use warnings;
use strict;
use XML::ComicsML; # ... damit wir ComicsML-Objekte bearbeiten können
use CGI qw(:standard);
use LWP;
use Date::Manip; # Ausgabe eines Datums ist sonst zu kompliziert
# Wir gehen davon aus, daß die URLs der ComicsML-Dokumente in einer
# Datei auf unserer Festplatte liegen, je eine URL pro Zeile.
# (Kein XML? Peinlich, peinlich ...)
my $url_file = $ARGV[0] or die "Usage: $0 url-file\n";
my @urls; # Liste der URLs
open (URLS, $url_file) or die "Kann die Datei $url_file nicht lesen: $!\n";
while (<URLS>) { chomp; push @urls, $_; }
close (URLS) or die "Kann die Datei $url_file nicht schließen: $!\n";
# Der LWP-UserAgent ist eine Art in Perl geschriebener Browser
my $ua = LWP::UserAgent->new;
my $parser = XML::ComicsML->new;
my @strips; # Liste der gelesenen Comic-Strips
foreach my $url (@urls) {
my $request = HTTP::Request->new(GET=>$url);
my $result = $ua->request($request);
my $comic; # Das zu lesende Comic-Objekt
if ($result->is_success) {
# Versuchen wir, die Datei mit dem ComicsML-Parser zu lesen.
unless ($comic = $parser->parse_string($result->content)) {
# Sieht nicht gut aus...
warn "Das Dokument $url ist kein korrektes XML-Dokument!\n";
next;
}
} else {
warn "Die URL $url konnte nicht gelesen werden: " . $result->status_line . "\n";
next;
}
# Als nächstes extrahieren wir alle einzelnen Strips aus dem Comic. Jeder Strip
# wird in eine Hashreferenz umgewandelt und abgelegt.
foreach my $strip ($comic->strips) {
push (@strips, {strip=>$strip, comic_title=>$comic->title, comic_url=>$comic->url});
}
}
# Strips nach Datum sortieren und ausgeben (dazu verwenden wir die Funktion UnixDate
# von Date::Manip).
my @sorted = sort {UnixDate($$b{strip}->date, "%s") <=> UnixDate($$a{strip}->date, "%s")}
@strips;
# Als nächstes bauen wir eine Webseite.
print header;
print start_html("Die aktuellsten Comics");
print h1("Links zu den aktuellsten Comics...");
# Die sortierte Liste in umgekehrter Reihenfolge: aktuelle Comics zuerst
foreach my $strip_info (@sorted) {
my ($title, $url, $svg);
my $strip = $$strip_info{strip};
$title = join (" - ", $strip->title, $strip->date);
# Link ausgeben
if ($url = $strip->url) {
$title = "<a href='$url'>$title</a>";
}
# Analog für den Titel des Comics
my $comic_title = $$strip_info{comic_title};
if ($$strip_info{comic_url}) {
$comic_title = "<a href='$$strip_info{comic_url}'>$comic_title</a>";
}
# Titelzeile ausgeben
print p("<b>$comic_title</b>: $title");
print "<hr />";
}
print end_html;
Verglichen mit dem Aufwand, den wir für das Beispiel Apache::DocBook betrieben haben, mag dieses Programm zu einfach erscheinen: Es betreibt keinen eingebauten Cache, es begrenzt die Menge der verarbeiteten Strips nicht, und es kümmert sich in keiner Weise um ein ansehnliches Layout. Als schneller Hack ist es aber durchaus brauchbar, es funktioniert und demonstriert den Vorzug eines Hilfsmoduls wie XML::ComicsML.
Unsere Tour durch die Welt von Perl und XML endet hier. Wie wir zu Beginn dieses Buchs schon erwähnt haben, ist die Beziehung zwischen beiden Technologien noch recht jung. Das volle Potential der Kombination ist noch nicht ausgeschöpft. Während wir dieses Buch geschrieben haben, sind neue Parser wie XML::LibXML und Philosophien wie PerlSAX2 erst entstanden. Wir hoffen, daß die erhaltenen Informationen trotzdem ausreichen. Lassen Sie sich ermutigen, Teil dieser Welt zu werden, in der in den kommenden Jahren weiterhin viele hochinteressante Neuigkeiten entstehen werden.
<aloha>Happy hacking!</aloha>
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema Perl & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Perl & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de