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:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. >
  3.  
  4. type="Video">
  5.     Urlaubsvideos
  6. >
  7.  
  8. >
  9.         >
  10.                 >Chile>
  11.                
  12.                 >Am Strand>
  13.                 year="2007">12.7.>
  14.                 -url>strand.flv-url>
  15.         >
  16.        
  17.             >
  18.                 >Mexiko>
  19.                 >Worte im Sand>
  20.                 year="2006">3.8.>
  21.                 -url>sand.flv-url>
  22.             >
  23.            
  24.             >
  25.                 >Brasilien>
  26.                 >Urwald>
  27.                 year="2006">12.9.>
  28.                 -url>sand.flv-url>
  29.             >   
  30. >
  31. >

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.
Actionscript:
  1. // neues URLLoader-Objekt
  2. var myLoader:URLLoader = new URLLoader();
  3.  
  4. // URL der XML-Datei
  5. var myURL = new URLRequest("videoplaylist.xml")
  6.  
  7. // URL laden
  8. myLoader.load(myURL);
  9.  
  10. // Eventlistener: wenn URL geladen --> onLoadComplete-Funktion ausfuehren
  11. myLoader.addEventListener(Event.COMPLETE, onLoadComplete);
  12.  
  13. // neues XML-Objekt
  14. var myXML:XML;

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.

Actionscript:
  1. // Kommentare in der XML Datei ignorieren
  2. XML.ignoreComments = true;   
  3.  
  4. // Leerzeichen ignorieren
  5. XML.ignoreWhitespace = true;

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.

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

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.

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

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.

Actionscript:
  1. // Wie viele Videos?
  2. trace ("Die Playlist enthält " + myXML.videos.item.length()) + " Video(s)"// 3 items

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.

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

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.

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

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.

Actionscript:
  1. // Welche(s) Video(s) von 2006?
  2. trace ("Von 2006 sind: " + myXML.videos.item.(date.@year == "2006")..title.text());

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.

Actionscript:
  1. // Suchergebnisse in einem  XMLList-Objekt ablegen
  2. var searchResult:XMLList = new XMLList (myXML.videos.item.(date.@year == "2006"));
  3. for (i = 0; i length(); i++) {
  4.     trace ("(searchResult) Von 2006 ist: " + searchResult.title[i]);   
  5. }

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

Actionscript:
  1. function onLoadComplete(evt : Event):void {
  2.         // Kommentare in der XML Datei ignorieren
  3.         XML.ignoreComments = true;   
  4.        
  5.         // Leerzeichen ignorieren
  6.         XML.ignoreWhitespace = true;
  7.        
  8.         // XML-Objekt erstellen (auch myLoader.data statt evt.target.data möglich)
  9.         myXML = new XML(evt.target.data);
  10.        
  11.         // Name der Playlist und Type der Playlist ausgeben
  12.         trace ("Diese Playlist heißt: " + myXML.playlistName.text() +" und ist vom Typ " + myXML.playlistName.@type)
  13.            
  14.         // Wie viele Videos?
  15.         trace ("Die Playlist enthält " + myXML.videos.item.length()) + " Video(s)"// 3 items
  16.        
  17.         // Den Titel jedes Videos ausgeben
  18.         var i:Number;
  19.         for (i = 0; i videos.item.length(); i++) {
  20.             trace ("     Name des Videos :" + myXML.videos.item[i].title.text()) + "\n";   
  21.         }
  22.  
  23.         // Item Nr.2 (=1) mithilfe von ..
  24.         trace ("Video 2 ist vom " + myXML..date[1].text() + myXML..@year[1]);
  25.        
  26.         // Welche(s) Video(s) von 2006?
  27.         trace ("Von 2006 sind: " + myXML.videos.item.(date.@year == "2006")..title.text());
  28.        
  29.         // Suchergebnisse in einem  XMLList-Objekt ablegen
  30.         var searchResult:XMLList = new XMLList (myXML.videos.item.(date.@year == "2006"));
  31.         for (i = 0; i length(); i++) {
  32.             trace ("(searchResult) Von 2006 ist: " + searchResult.title[i]);   
  33.         }      
  34.        
  35.        
  36. }

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)