Platzhalter

 
Platzhalter PlatzhalterPlatzhalter

Textfile-Datenbanken mit Perl & XML

Platzhalter
 
  Startseite
  eBook-Projekt
  Web-Lexikon
  Bücher bestellen
   
  Design-Theorie
  Design-Praxis
  Promotion
  HTML/XML-Praxis
  Projekt-Management
  Webmaster-Praxis
  Fragen & Antworten
  Technik-Ecke
   
  Portal/Links
  Buch-Rezensionen
  Software
  Impressum
PlatzhalterPlatzhalter







 

Platzhalter Ein eigenes Datenbanksystem zu programmieren ist immer mühselig. Wie trenne ich Datensätze? Und wie trenne ich einzelne Datenfelder? Beliebt und immer wieder gerne gesehen: Datensatz-Trennung mit einem Zeilenumbruch, Datenfeld-Trennung mit einem |. Doch leider ziemlich kompliziert zu verarbeiten...

Aus meiner Sicht einfacher ist da eine kleine XML-Datenbank der Struktur

<datensatz>
<name>dsatz1</name>
<feld1>irgendein wert</feld1>
</datensatz>
<datensatz>
<name>dsatz2</name>
<feld1>irgendein anderer wert</feld1>
</datensatz>


Wirklich einfach die dazugehörige Parsing-Routine:

sub readdb
{
my %rg;
my $dbfile = "pfad//db/accounts.dat";
open(DATEI, "<$dbfile") || die("$dbfile kann nicht geöffnet werden");
flock(DATEI, 1) || &error("Kann $dbfile nicht sperren");
my $content = join('', <DATEI>);
close(DATEI);

my $b;
while($content =~ s/<datensatz>(.+?)<\/datensatz>//s)
{
    my $data = $1;
    my %heredata;

    while ($data =~ s/<(\S+?)>(.+?)<\/\1>//s)
    {
        my $tagname = $1;
        my $tagin = $2;
        $heredata{lc($tagname)} = $tagin;
    }
    $rg{$heredata{name}} = \%heredata;
}
    
return \%rg;

}

Diese Routine gibt eine Hash-Referenz zurück. Die Hash-Keys entsprechen dabei den Datensatznamen, die zugehörigen Hash-Werte enthalten eine Referenz auf den zugehörigen Wert. Wer also auf das Datenfeld "feld1" des Datensatzes "dsatz2" zugreifen will, verwendet diesen Code:

my %dsaetze = %{&readdb()};
my $wert_von_feld1 = $dsaetze{'dsatz2'}->{'feld1'};


Wo ist hier nun der Vorteil gegenüber herkömmlichen, "normalen" Textfile-Datenbanken?

In meinen Augen entscheidend ist der reduzierte Verwaltungsaufwand. Man muss sich praktisch nicht um das Quoting von Meta-Zeichen kümmern, nur eine Überprüfung der Eingabedaten auf das Zeichen '<' sollte vorgenommen werden. Noch viel besser: das Hinzufügen eines Datenfeldes ist kein Problem. Wie Sie sicher schon bemerkt haben, werden die Datenfeldnamen nämlich direkt aus der Datenbank genommen. Eine separate Definition, und sei sie auch nur in der ersten Zeile der Datenbankdatei, ist nicht nötig.

Auch die Programmierung einer Schreib-Routine sollte den einigermaßen erfahrenen Programmierer vor kein allzu großes Problem stellen. Der Vorgang müsste so ablaufen, dass einer Prozedur der ausgelesene und veränderte Hash übergeben wird. Diese Prozedur schreibt dann die komplette Datei neu. Der folgende, nicht voll funktionsfähige Pseudocode könnte dabei helfen:

# %dsaetze wurde uebergeben, DATEI geöffnet
foreach my $key (keys %dsaetze)
{
    my $val = $dsaetze{$key};
    print DATEI qq(<datensatz>\n);
    foreach my $key2 (keys %$val)
    {
        my $val2 = $val->{$key2};
        print qq(\t<${key2}>${val2}</${key2}>);
    }    
    print DATEI qq(</datensatz>\n);    
}



Autor: Alexander Dilthey | Erstmalig veröffentlicht: 09.03.2001 | Einen Artikel schreiben?

 

Neue Artikel

Rezension: Entwurfsmuster von Kopf bis Fuß
Rezension: Webdesign mit CSS
AJAX - XML und JavaScript in Schönheit vereint?
Rich Email - Flash im Newsletter
Screen Reader Usability
Comment Spam und CAPTCHAs
Logfile-Analyse selbst gemacht - ein Perl-Beispiel

Partnerprogramm




Kommentar

Ist die Freiheit der Informationsgesellschaft in Gefahr?
Derzeit leben wir in einer relativ freien Welt. Doch sind derzeit Tendenzen erkennbar, die Freiheit des Individuums den Interessen der Großindustrie zu opfern. Ein Kommentar.

Druckversion
Sie wollen diese Seite ausdrucken? Dafür haben wir eine spezielle Druckversion ohne grafische Elemente entwickelt!



Einführung in CSS bei HTMLWorld.