XML Database Publishing mit Perl

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 Perl Skript

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.

Das Ergebnis

Anzeige einer xml Datei

Ihr Kommentar


home - contact - q-zone - dev-zone