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. // URL der XML-Datei
  3. "videoplaylist.xml")
  4.  
  5. // URL laden
  6. // Eventlistener: wenn URL geladen --> onLoadComplete-Funktion ausfuehren
  7. // neues XML-Objekt
  8.  

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. // Leerzeichen ignorieren
  3.  

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.  

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. "Diese Playlist heißt: "" und ist vom Typ "

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. "Die Playlist enthält "" 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. "     Name des Videos :""\n";   
  3. }

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. "Video 2 ist vom "

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. "Von 2006 sind: ""2006"

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. "2006""(searchResult) Von 2006 ist: "

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

Actionscript:

  1. span style="color: #808080; font-style: italic;">// Kommentare in der XML Datei ignorieren
  2. // Leerzeichen ignorieren
  3. // XML-Objekt erstellen (auch myLoader.data statt evt.target.data möglich)
  4. // Name der Playlist und Type der Playlist ausgeben
  5. "Diese Playlist heißt: "" und ist vom Typ "// Wie viele Videos?
  6. "Die Playlist enthält "" Video(s)"// 3 items
  7.        
  8.         // Den Titel jedes Videos ausgeben
  9. "     Name des Videos :""\n";   
  10.         }
  11.  
  12.         // Item Nr.2 (=1) mithilfe von ..
  13. "Video 2 ist vom "// Welche(s) Video(s) von 2006?
  14. "Von 2006 sind: ""2006"// Suchergebnisse in einem  XMLList-Objekt ablegen
  15. "2006""(searchResult) Von 2006 ist: "

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)