Meine erste Frage natürlich:
Warum XML-"Dateien" in einer Datenbank?
Wenn du den Katalog in XML speichern willst, dann brauchst du das doch nicht in eine DB legen. Andererseits, wenn du die Daten in eine DB legst, dann brauchst du sie doch nicht in XML formatieren.
Aus einer Datenbank einzelne Datensätze (deine "Unterbücher") auszulesen ist sehr einfach und aus einer Datenbank-Tabelle einen Bücher-Katalog in XML zu formatieren und als Datei abzuspeichern ist auch sehr einfach.
Aus einem XML-File einzelne Elemente auszulesen geht auch, ist aber mitunter etwas aufwändiger. Es gibt vermutlich für alle in Frage kommenden Sprachen frei erhältliche XML-Parser. Die funktionieren so, dass bei einem Start-Tag eine Funktion aufgerufen wird, der der Name des Tags und die Attribute übermittelt werden, ebenso beim End-Tag (ohne Attribute dann natürlich) und für den Text zwischen den Tags wird eine dritte Funktion aufgerufen.
In der ersten Funktion musst du also den Tag und die Attribute global speichern und die Variable, die die Schachtelungstiefe angibt eins hochzählen. Am geschicktesten packst du also den Tag und die Attribute in ein oder mehere Arrays mit Index=Verschachtelungstiefe.
Die zweite Funktion bekommt dann den Inhalt zwischen den Tags übergeben. Ich denke, hier macht es Sinn, die Inhalte noch nicht zu bearbeiten, sondern dies vom End-Tag-Handler machen zu lassen (die Tags sind ja geschachtelt und der tatsächliche, ganze Inhalt zwischen zwei Tags (z.B. <buch> und </buch>) liegt ja erst dort vor.
Die dritte Funktion, die beim Parsen eines End-Tags aufgerufen wird hat dann tatsächlich alle nötigen Daten zur Verfügung: den Namen des Tags, die Attribute und den Inhalt. Hier kannst du dann einfach abfagen ob z.B. das gerade eingelesene Buch auch angezeigt werden soll oder nicht. Wenn nicht, dann verwirfst du den erzeugten String, wenn doch, dann fügst du noch die HTML-Tags (Tabelle o.ä.) ein und übergibst es dem Inhalt des übergeordneten XML-Tags.
Beispiel:
XML-File:
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"><katalog>
<buch id=1>
<autor>Hans Müller</autor>
<titel>Das Lexikon der Bücher</titel>
<band band=1>
<untertitel>Geschickte des Buchdrucks</untertitel>
<beschreibung>blubb blubb <fett>BLUBB</fett></beschreibung>
</band>
<band band=2>
<untertitel>Klassische Literatur</untertitel>
<beschreibung>bla bla</beschreibung>
</band>
</buch>
</katalog>[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Die Funktionen werden also folgendermaßen aufgerufen:
funktion start_tag(tag="katalog"):
- level=0, tag[0]="katalog"
funktion inhalt(inhalt=" "):
- leerzeichen entfernen
- inhalt[0]=""
funktion start_tag(tag="buch" attr="id=1"):
- level=1, tag[1]="buch", attr[1]="id=1"
funktion inhalt(inhalt=" "):
- leerzeichen entfernen
- inhalt[1]=""
funktion start_tag(tag="autor"):
- level=2, tag[2]="autor"
funktion inhalt(inhalt="Hans Müller"):
- inhalt[2]="Hans Müller"
funktion end_tag(tag="autor"):
- inhalt[2]="<b>"+inhalt[2]+"</b><br>" (also:inhalt[2]=Hans Müller)
- level=level-1 (also level=1)
...das gleiche mit dem Titel.
Dann kommt das erste Tag <band>. Beim End-Tag hast du dann z.B.:
tag[3] = "band"
attr[3] = "band=1"
inhalt[3]= "<p><i>Die Geschichte des Buchdrucks</i></p><p>blubb blubb <b>BLUBB</b></p>"
Wenn Band 1 nun angezeigt werden soll, dann übergibst du den Inhalt an die übergeordnete Ebene:
inhalt[2]=inhalt[2]+inhalt[3]
ansonsten verwirfst du ihn:
inhalt[3]=""
Und so weiter, bis du bei </katalog> ankommst.
Ich hoffe, ich konnte dir helfen.
Liebe Grüße,
Basti