ActionScript3: XML

Die bisher übliche Art und Weise der Verarbeitung von XML-Dateien wird auch in der kommenden Flash Version 9 weiterhin vorhanden sein. Sie ist im Package flash.xml als Klasse XMLDocument angesiedelt. In Flash 9 wird zusätzlich eine neue Möglichkeit hinzukommen: ECMAScript for XML (E4X). Der Vorteil von E4X besteht darin, dass eine native XML-Unterstützung mit einfacherer Syntax geboten wird.

Es folgt ein Beispiel einer Playlist im XML-Format für einen (fiktiven) FLV-Player. Es zeigt die relevanten Befehle in ActionScript 3 zum Laden und Verarbeiten von XML-Dateien.

1. Die XML-Datei

Bei einem Videoplayer hat eine externe XML-Datei den Vorteil, dass man den Player leicht um neue Videos ergänzen kann. Es genügt ein Update der XML-Datei. Das SWF-File muss nicht neu kompiliert werden. Hier zunächst die XML-Datei, die als Beispiel für ein solches Vorhaben dienen könnte:

[xml]
Urlaubsvideos



Chile

Am Strand
12.7.
strand.flv


Mexiko
Worte im Sand
3.8.
sand.flv


Brasilien
Urwald
12.9.
sand.flv

[/xml]

Das Ergebnis, das die weiter unten erläuterte SWF-Datei ausgeben wird, sieht so aus:

XML mit ActionScript 3 Beispiel: Ausgabefenster

2. Eine XML-Datei laden

Im ersten Schritte muss die XML-Datei geladen werden. Die Vorgehensweise sieht folgendermaßen aus:

  • Um eine XML-Datei zu laden, benötigt man zuerst ein neues Objekt vom Typ URLLoader.
  • Anschließend wird die URL der XML-Datei in ein Objekt vom Typ URLRequest geschrieben.
  • Jetzt wird die Datei mit der Methode load geladen.
  • Ein EventListener wird angefügt. Er sorgt dafür, dass nachdem die Datei vollständig geladen ist die Funktion onLoadComplete ausgeführt wird
  • Nun wird das XML-Objekt angelegt. Es enthält jedoch noch nichts. Der Konstruktor kann erst in der Funktion onLoadComplete aufgerufen werden, da die Daten vorher nicht zur Verfügung stehen.

[as]
// neues URLLoader-Objekt
var myLoader:URLLoader = new URLLoader();

// URL der XML-Datei
var myURL = new URLRequest(„videoplaylist.xml“)

// URL laden
myLoader.load(myURL);

// Eventlistener: wenn URL geladen –> onLoadComplete-Funktion ausfuehren
myLoader.addEventListener(Event.COMPLETE, onLoadComplete);

// neues XML-Objekt
var myXML:XML;
[/as]

3. Mit XML-Daten arbeiten

Die folgenden Zeilen werden nach dem Laden der XML-Datei ausgeführt. Zuerst wird festgelegt, dass Kommentare und Leerzeichen ignoriert werden sollen.

[as]
// Kommentare in der XML Datei ignorieren
XML.ignoreComments = true;

// Leerzeichen ignorieren
XML.ignoreWhitespace = true;
[/as]

Nun kann das XML-Objekt anhand der Daten aus dem URLLoader erstellt werden. Bei ActionScript 3 wird man nun endlich auch auf Fehler in der XML-Datei, z.B. nicht-geschlossene Tags, hingewiesen.

[as]
// XML-Objekt erstellen (auch myLoader.data statt evt.target.data möglich)
myXML = new XML(evt.target.data);
[/as]

Was mit nativer XML-Unterstützung in AS3 gemeint ist, zeigt sich nun beim Auslesen der Daten: Das XML-Objekt myXML hat nun genau den gleichen Aufbau wie die XML-Datei. Mittels Anhängen eines Punkts („.“) kann man sich durch die XML-Datei navigieren. So erreicht man z.B. den playlistName über myXML.playlistName.

Über die Methode .text() wird der Textinhalt des entsprechenden Elements zurückgegeben. XML-Attribute sind über das @-Zeichen erreichbar.

[as]
// Name der Playlist und Type der Playlist ausgeben
trace („Diese Playlist heißt: “ + myXML.playlistName.text() +“ und ist vom Typ “ + myXML.playlistName.@type);
[/as]

Eine weitere nützliche Methode heißt length(). Sie gibt aus, wie viele Elemente vorhanden sind. Im Beispiel soll ausgegeben werden, wie viele „items“ unter dem Knoten „video“ zu finden sind.

[as]
// Wie viele Videos?
trace („Die Playlist enthält “ + myXML.videos.item.length()) + “ Video(s)“; // 3 items
[/as]

Mit dieser Information kann nun eine Schleife bauen, die die Namen aller Videos liefert. Wie man sieht kann mit der eckigen Klammer ein beliebiges Element direkt angesprochen werden.

[as]
// Den Titel jedes Videos ausgeben
var i:Number;
for (i = 0; i < myXML.videos.item.length(); i++) { trace (" Name des Videos :" + myXML.videos.item[i].title.text()) + "\n"; } [/as]

Etwas komplizierter ist die Navigation durch das XML-Objekt mittels „..“. Die zwei aufeinanderfolgenden Punkte (..) kann sich wie eine Suchfunktion vorstelle. myXML..date sucht das Element mit dem Namen date, egal wo und in welcher Hierarchie-Tiefe es auftritt. Wäre date es doppelt vorhanden, z.B. zusätzlich im Tag playlistName, würde auch dieses zurückgegeben werden.

[as]
// Item Nr.2 (=1) mithilfe von ..
trace („Video 2 ist vom “ + myXML..date[1].text() + myXML..@year[1]);
[/as]

Selbstverständlich kann man auch nach bestimmten Werten in der XML-Datei suchen. Möchte z.B. wissen, welche Videos von 2006 sind, hangelt man sich zum year-Attribute: myXML.videos.item.(date.@year == „2006“). Somit werden alle Datensätze aus 2006 gewählt. Durch das Anhängen von ..title.text() werden bei diesen Datensätze dann der „Title“ angezeigt.

[as]
// Welche(s) Video(s) von 2006?
trace („Von 2006 sind: “ + myXML.videos.item.(date.@year == „2006“)..title.text());
[/as]

Schön wäre es natürlich nun, wenn man die einzelnen Ergebnisse nicht am Stück bekommen würde („Von 2006 sind: MexikoBrasilien“), sondern getrennt behandeln kann. Deshalb kommt nun ein Objekt vom Typ XMLList zum Einsatz. Ein XMLList-Objekt ist in den Eigenschaften und Methoden nahezu identisch mit einem XML-Objekt. Im Beispiel wird es dazu verwendet, dass nur genau der Teil des XML-Baums vom myXML im XMLList-Objekt abgespeichert wird, der vom Jahr 2006 ist. Somit hat man quasi das Suchergebnis abgelegt und kann damit weiterarbeiten.

[as]
// Suchergebnisse in einem XMLList-Objekt ablegen
var searchResult:XMLList = new XMLList (myXML.videos.item.(date.@year == „2006“));
for (i = 0; i < searchResult.length(); i++) { trace ("(searchResult) Von 2006 ist: " + searchResult.title[i]); } [/as]

Hier der komplette Code der Funktion onLoadComplete am Stück:

[as]
function onLoadComplete(evt : Event):void {
// Kommentare in der XML Datei ignorieren
XML.ignoreComments = true;

// Leerzeichen ignorieren
XML.ignoreWhitespace = true;

// XML-Objekt erstellen (auch myLoader.data statt evt.target.data möglich)
myXML = new XML(evt.target.data);

// Name der Playlist und Type der Playlist ausgeben
trace („Diese Playlist heißt: “ + myXML.playlistName.text() +“ und ist vom Typ “ + myXML.playlistName.@type);

// Wie viele Videos?
trace („Die Playlist enthält “ + myXML.videos.item.length()) + “ Video(s)“; // 3 items

// Den Titel jedes Videos ausgeben
var i:Number;
for (i = 0; i < myXML.videos.item.length(); i++) { trace (" Name des Videos :" + myXML.videos.item[i].title.text()) + "\n"; } // Item Nr.2 (=1) mithilfe von .. trace ("Video 2 ist vom " + myXML..date[1].text() + myXML..@year[1]); // Welche(s) Video(s) von 2006? trace ("Von 2006 sind: " + myXML.videos.item.(date.@year == "2006")..title.text()); // Suchergebnisse in einem XMLList-Objekt ablegen var searchResult:XMLList = new XMLList (myXML.videos.item.(date.@year == "2006")); for (i = 0; i < searchResult.length(); i++) { trace ("(searchResult) Von 2006 ist: " + searchResult.title[i]); } } [/as] In eigener Sache: Ein XML-Flashvideo-Player gibt’s übrigens auf der CD-ROM zum Buch „Interaktives Video im Internet mit Flash“.

Link: Quelldateien als ZIP-File (Flash 9 Alpha benötigt)
Link: XML-Klasse (ActionScript 3 Dokumentation)
Link: XMLDocument (die alte XML-Klasse von ActionScript 2 in AS3)

9 Gedanken zu „ActionScript3: XML“

  1. besten dank, du hast mich nach einem sehr langen nachmittag vor einem noch längeren abend bewahrt;)

    greets

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert