Flash und XML unter einem Dach
Artikel erschienen in Swiss IT Magazine 2002/01
Mit dem XML-Objekt wird es Flash ermöglicht, XML-Dokumente einzulesen, zu verarbeiten und auch zu erzeugen. Wie jedes andere Objekt in Flash 5 muss auch eine Variable zunächst mit dem Schlüsselwort new erzeugt werden. Dazu stehen zwei Konstruktoren zur Verfügung:
|
Die erste Form eignet sich gut, um in Flash ein XML-Dokument von Grund auf neu zu erstellen. Die zweite Form übernimmt einen XML-Quellcode als String, so dass hier schon vorhandener XML-Code übergeben werden kann. Eine Aufstellung aller Methoden und Eigenschaften des XML-Objekts findet sich im Web.
Wie das folgende Beispiel zeigt, ist aber auch die direkte Übergabe von XML-Objekten möglich:
|
Damit enthält myObj bereits ein vollständiges XML-Objekt mit dem XML-Knoten (NodeName) <H1> und dem Wert (NodeValue) "Header". Vom Typ her handelt es sich hierbei um einen TextNode. Diese Informationen können mit dem Flash-eigenen Debugger angezeigt werden.
Der Debugger in Flash ist eigentlich kein richtiger Debugger, sondern mehr ein Viewer. Dennoch ist es ganz nützlich, sich die XML-Variable damit einmal anzuschauen, weil so die ganze Struktur des XML-Objekts etwas deutlicher wird:
Um den Film im Debug-Modus zu starten, verwendet man entweder den Menüpunkt Steuerung - Fehlersuche oder die Tastenkombination <Strg>+<Shift>+<Enter>. Im jetzt angezeigten Debug-Fenster sollte eine Filmsequenz "_level0" sichtbar sein. Ist das nicht der Fall, sollte man den Film wieder beenden (ohne das Debug-Fenster zu schliessen) und es noch einmal versuchen. Leider hat Flash manchmal Probleme bei der korrekten Anzeige im Debug-Fenster.
Man sieht, wie dieses einfache Beispiel schon eine recht komplex geschachtelte Struktur erzeugt:
|
Um den Aufbau eines solchen XML-Baumes zu verdeutlichen, soll diesem Beispiel ein weiterer Knoten hinzugefügt werden:
|
Die erstellte Variable myText gehört in diesem Fall zu einem dynamischen Textelement, so dass der resultierende XML-Quellcode im Flashfilm angezeigt wird. Als Ergebnis für das hinzugefügte Element erhält man schliesslich den XML-Code:
|
Werden Attribute zu einem XML-Element benötigt, so können diese über die Eigenschaft "attribute" definiert und ausgelesen werden:
|
Obige Anweisungen ergeben dann den folgenden XML-Code:
|
Damit wurden bisher nur Elemente erzeugt, die keine Inhalte haben. Um diese ebenfalls einzufügen, muss ein XML-Textknoten als Child des Elements eingefügt werden:
|
Damit erhält man schliesslich den folgenden XML-Code:
|
Um die einzelnen Elemente anzufügen, muss man die Gesamtstruktur des XML-Dokuments beachten. Ausgehend von dem Hauptknoten (dem Dokument selbst), gibt es den ersten Child-Knoten (hier: "first_Element"). Unterhalb eines jeden Knotens können weitere Child-Knoten existieren (hier: der Textknoten zu "first_Element").
Ausserdem können zu jedem Knoten gleichberechtigte Geschwister (Siblings) existieren, die auf der gleichen Ebene stehen wie der referenzierte Knoten.
Um dies etwas deutlicher zu machen, soll folgendes XML-Dokument analysiert werden, das einen Auszug aus einem Adressenstamm darstellt:
|
Der Knoten "address" ist der erste childNode unterhalb des Dokuments. Die Knoten "fname", "lname" und "street" befinden sich allesamt auf der gleichen Ebene, sind also "siblings" des ersten childNode "address". Der Flash-Code zeigt nun diese Elemente einzeln an:
|
Ein neues XML-Objekt wird erzeugt und mit der Methode load() von der Textdatei eingelesen. Hinweise zu der Eigenschaft "ignoreWhite" sind im Textkasten beschrieben. Um das Beispiel in der gleichen Weise nachvollziehen zu können, sollten alle Zeilenschaltungen aus dem XML-Code entfernt werden. Mit dem Ereignis onLoad wird die Funktion loader() aufgerufen, die später im Code definiert wird.
|
Die Funktion show_adr() liest den ersten Child-Knoten und zeigt dessen node-Namen an. Das ist in diesem Beispiel "address". Der Child-Knoten des address-Elements ist wiederum ein XML-Knoten mit dem Namen "fname". Um gleichzeitig auch den Inhalt anzuzeigen, wird der Text der childNode von fname über firstChild.nodeValue gleich mit ausgegeben. Die einzelnen Geschwister werden dann nacheinander mit "nextSibling" abgerufen und deren Namen und Inhalt angezeigt.
|
Die Funktion loader wird über das onLoad-Ereignis beim Laden des XML-Codes automatisch aufgerufen. Ist die Variable "success" auf true gesetzt, so wurde der Code vollständig gelesen. Diese Abfrage ist insbesondere dann wichtig, wenn grösserer XML-Code über das Internet eingelesen werden soll. Solange der Code nicht vollständig gelesen wurde, kann auch keine Auswertung erfolgen.
Das XML-Objekt ist ein leistungsstarkes Tool, wenn es darum geht, XML-Code zu analysieren und auszuwerten. Da der gesamte XML-Code als Baum im Speicher gehalten wird, benötigt dieses Objekt gerade bei umfangreichen XML-Dokumenten sehr viel Arbeitsspeicher. Der Vorteil dieser Methode ist jedoch, dass eine Navigation zwischen den XML-Knoten des Dokuments möglich ist. Wegen des komplexen Aufbaus eines solchen Dokumentenbaumes ist eine solche Navigation jedoch gewöhnungsbedürftig und nicht ganz einfach.