Thema: XML-Datei in "Häppchen" anzeigen???

Hallo,

ich stecke gerade noch so in meinen XML-Anfängen und muss ein Problem lösen, von dem ich nicht weiss, ob es so überhaupt lösbar ist:
es geht um eine XML-Datei, die unter dem Wurzelelement Hauptbuch mehrere Unterbücher mit wiederum mehreren Bänden abbildet. Die Daten dazu werden aus einer Access:-(-DB ausgelesen.Meine Auftraggeberin möchte nun, dass quasi zur Laufzeit über links ein einzelnes Unterbuch angesprochen werden kann, d.h. dass erst alles komplett aus der DB rausgezogen wird, die XML-Datei vorliegt und erst dann vom User entschieden wird, welches Unterbuch er sich anzeigen lassen will. Geht das überhaupt und wenn ja: ist das nicht superaufwändig???
Wäre klasse, wenn mir hier jemand helfen könnte!

2

Re: XML-Datei in "Häppchen" anzeigen???

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

Re: XML-Datei in "Häppchen" anzeigen???

Hallo Basti,

erstmal Danke für Deine Hilfe - irgendwie stelle ich immer wieder fest, dass XML doch umfangreicher ist als es auf den ersten Blick den Anschein hat...
Zu Deinen Fragen bezügl. der Datenbank: die XML-Datei liegt natürlich nicht in der DB, da sind das, so weit ich weiss, normale Texte, die dann eben mit XML in einem Browser angezeigt werden sollen. Ich habe erst vor zwei Wochen angefangen an dem Projekt zu arbeiten und habe auch  noch nicht so ganz den Durchblick; ich zweifel auch, ob die Wünsche meines Auftraggebers sinnvoll sind, manchmal denke ich, man müsste alles, was die sich bisher ausgedacht haben, nochmal genau prüfen und ein vernünftiges Gesamtkonzept erstellen, aber für mich ist das nur ein Ferienjob und deswegen fehlt dafür wohl die Zeit.
Na, auf jeden Fall nochmal vielen Dank!

Viele Grüsse
Maja