Unser Veranstaltungsdatenbestand können wir auch benutzen, um XML-Daten zu erzeugen. Dazu müssen wir unser Perlskript nur wenig modifizieren. Da meistens eine gute Idee ist, sich über das Ziel im klaren zu sein, bevor man sich auf den Weg macht, sehen wir uns zunächst an wie eine solche XML-Datei aussehen kann:
<?xml version="1.0"?> <veranstaltungen version="1.0"> <veranstaltung> <titel>Luke 5</titel> <ort>Birdland</ort> <zeit>21.00</zeit> <kategorie>Musik</kategorie> </veranstaltung> </veranstaltungen>
Das Perlskript funktioniert im großen und ganzen wie unser
Perlskript zum erzeugen der XTags. Wir benutzen es daher als Ausgangsbasis
und ändern nur die eigentliche Routine zum Verarbeiten der Daten, während
die Auswahl der Datei, Ein und Ausgabe gleich bleiben kann.
Ändern müssen wir im wesentlichen die Funktion processFile.
Das Gerüst für diese Funktion sieht folgendermaßen aus:
sub processFile{ my($filename) = @_; # hole Funktionsparameter open( INPUT, $filename) # öffne Eingabedatei or die "kann $filename nicht oeffnen"; open( OUTPUT, ">$filename.xtags") # erzeuge und öffne Ausgabedatei or die "kann $filename.xtags nicht schreiben"; print "ich konvertiere $filename\n"; # Statusmeldung # jetzt koennen wir mit der eigentlichen Konvertierung anfangen print OUTPUT $xmlstart; while(<INPUT>) # für jede Eingabezeile { # verarbeite Zeile und gebe sie aus } # end while print OUTPUT $xmlend; close( OUTPUT ); close( INPUT ); MacPerl::SetFileInfo("ALFA","TEXT","$filename.xtags");# set Filetype to Alpha Editor }
Wir näheren uns der eigentlichen Arbeit: das
Konvertieren in XML Marken. Jede XML Marken Datei sollte in der
mit einen Header beginnen. Wir definieren zunächst den Anfang und das
Ende der Datei
$xmlstart = qq(<?xml version="1.0"?>\n<veranstaltungen version="1.0">\n\n); $xmlend = "</veranstaltungen>";
Danach definieren wir die XML Tags, die wir verwenden wollen:
@xmltags = qw( datum zeit titel bemerkung ort kategorie );
Jetzt analysieren wir die Eingabedatei. Jede Zeile wird in Ihre
Bestandteile aufgespaltet:
($vdate, $vtitle, $vremark, $vplace, $vtime, $vkat) = split /\t/;
Vor jedem gültigem Datensatz geben wir ein <veranstaltung> und danach ein </veranstaltung> aus, der Übersicht halber jeweils mit einem Neue-Zeile-Zeichen:
if(defined $vtitle) # Falls übnerhaupt was zu tun ist { print OUTPUT "<veranstaltung>\n"; ... print OUTPUT "</veranstaltung>\n"; }
Danach geben wir die restliche Information über eine Veranstaltung aus. Um uns die Arbeit mit den Tags ein wenig zu erleichtern, schreiben wir uns eine kleine Funktion, die einen Text in Tags setzt:
sub tagify{
my($tag, $text)= @_;
return "<$tag>$text</$tag>\n";
}
Damit können wir die einzelnen Tags erzeugen.
Zu beachten ist noch, daß wir kein
überflüssiges Tag erzeugen, falls eine Veranstaltung
keine besonderen Bemerkungen enthält:
print OUTPUT &tagify( $xmltags[2], $vtitle); # verhindere das bei fehlender $vremark ein Komma übrigbleibt print OUTPUT &tagify( $xmltags[3], $vremark) unless $vremark eq ""; print OUTPUT &tagify( $xmltags[4], $vplace); print OUTPUT &tagify( $xmltags[1], $vtime); print OUTPUT &tagify( $xmltags[5], $vkat);
Eine Falle lauert noch: was wenn eine besonders progressive Technogruppe
in ihren Namen spitze Klammen verwendet, sich z.B. "<zeit>" nennnt?
Unsere ganze schöne Dokumenten struktur würde dadurch zerstört!.
Falls ein "<" oder ">" im Eingabetext auftaucht, werde wir es
deshalb konvertieren.
Hierfür benutzen wir eine Funktion mit Namen
specialXmlChars
sub specialXmlChars { $_[0] =~s|<|<|; $_[0] =~s|>|>|; return $_[0]; }
Jetzt müssen wir aus diesen Bausteinen noch das ganze Skript zusammensetzen: Anzeige des fertigen Skriptes.