SimpleXML statt mySQL

Dynamische Seiten sind in vielerlei Hinsicht praktischer als statische Seiten. Doch für so manche Anwendung ist der Einsatz einer Datenbank maßlos überdimensioniert, überhaupt nicht geeignet oder man hat noch nicht einmal einen Webspace mit Datenbankunterstützung.

Hier kommt XML ins Spiel. Man kann in einem XML-Dokument die ganze Struktur einer Datenbank nachbilden (natürlich nur mit aufgelösten Beziehungen), wobei ich insbesondere die m:n Beziehung in XML sogar als angenehmer empfinde, sowohl bei der Notation, als auch der Abfrage. Und dank fertiger Funktionen wie SimpleXML ist der Umgang mit XML-Dateien auch kaum komplizierter als eine DB-Abfrage.

Ich nehme als Beispiel mal eine kleine Linkliste.

 
Die Dokumentstruktur

Da man eine XML-Datei strukturieren kann, wie man möchte, sollte es nicht sonderlich schwer fallen, seine Ideen und Vorstellungen umzusetzen. Für eine einfache Linkliste wird ohnehin nicht viel benötigt: ein Linktitel, die URL und eine oder mehrere Kategorien, nach denen man Filtern kann. Vorteil gegenüber statischer Linklisten: keine redundanten Einträge.

<?xml version="1.0" encoding="UTF-8" ?>
<xfav>
  <entry>
    <title>SelfHTML</title>
    <url>http://de.selfhtml.org/</url>
    <category>HTML</category>
    <category>CSS</category>
    <category>JavaScript</category>
  </entry>
</xfav>

Als Datenbank wäre die Struktur schon etwas komplexer, da man die Kategorien als m:n Beziehung mit insgesamt 3 Tabellen umsetzen müsste.

 
Die Abfrage

Dank SimpleXML ist das Einlesen und Filtern der Einträge aus der XML-Datei keine große Herausforderung. Der Inhalt der Datei wird als mehrdimensionales Array zur Verfügung gestellt.

$xfav = array(
  "title"    => "SelfHTML";
  "url"      => "http://de.selfhtml.org/";
  "category" => array("HTML","CSS","JavaScript")
)

Die Ausgabe mit Filterfunktion könnte nun folgendermaßen aussehen:

<?php
$list = "HTML"; // all, none
$xfav = simplexml_load_file('xfav.xml');

if ($list == "none")
  echo "Bitte Kategorie auswählen!";
else {
  echo "Gewählte Kategorie: ".$list."<br>";
  foreach ($xfav->entry as $entry) {
    if ($list == "all")
      echo '<a href="'.$entry->url.'">'.$entry->title.'</a><br>';
    else {
      foreach ($entry->category as $category) {
        if ($category == $list)
          echo '<a href="'.$entry->url.'">'.$entry->title.'</a><br>';
      }
    }
  }
}
?>

Natürlich hat diese Variante gegenüber einer Datenbankabfrage nicht den gleichen Komfort. Möchte man in diesem Beispiel die Einträge zusätzlich zur Filterung auch noch alphabetisch sortiert haben, muss man sich die dafür nötige Sortierfunktion selbst erstellen.

Man sollte auch nicht außer Acht lassen, dass die Variante mit einer XML-Datei deutlich belastender für den Server ist. Es muss jedes Mal die komplette Datei eingelesen und in ein Array umgewandelt werden und beim Filtern muss auch jeder Eintrag einzeln geprüft werden. Es gibt weder Indexe noch Buffer oder Caches, die dem Server die Arbeit vereinfachen. Daher ist der Einsatz von XML als DB-Ersatz nur bei kleinen Datenmengen zu empfehlen.