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 version="1.0" encoding="utf-8"?>
-
> -
-
type="Video"> -
Urlaubsvideos
-
>
-
-
> -
- >
-
> Chile> -
-
> Am Strand> -
year="2007"> 12.7.> -
-url> strand.flv-url> -
>
-
-
- >
-
> Mexiko> -
> Worte im Sand> -
year="2006"> 3.8.> -
-url> sand.flv-url> -
>
-
-
- >
-
> Brasilien> -
> Urwald> -
year="2006"> 12.9.> -
-url> sand.flv-url> -
>
-
>
-
>
Das Ergebnis, das die weiter unten erläuterte SWF-Datei ausgeben wird, sieht so aus:
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.
-
// neues URLLoader-Objekt
-
// URL der XML-Datei
-
"videoplaylist.xml")
-
-
// URL laden
-
// Eventlistener: wenn URL geladen --> onLoadComplete-Funktion ausfuehren
-
// neues XML-Objekt
-
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.
-
// Kommentare in der XML Datei ignorieren
-
// Leerzeichen ignorieren
-
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.
-
// XML-Objekt erstellen (auch myLoader.data statt evt.target.data möglich)
-
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.
-
// Name der Playlist und Type der Playlist ausgeben
-
"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.
-
// Wie viele Videos?
-
"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.
-
// Den Titel jedes Videos ausgeben
-
" Name des Videos :""\n";
-
}
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.
-
// Item Nr.2 (=1) mithilfe von ..
-
"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.
-
// Welche(s) Video(s) von 2006?
-
"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.
-
// Suchergebnisse in einem XMLList-Objekt ablegen
-
"2006""(searchResult) Von 2006 ist: "
Hier der komplette Code der Funktion onLoadComplete am Stück:
-
span style="color: #808080; font-style: italic;">// Kommentare in der XML Datei ignorieren
-
// Leerzeichen ignorieren
-
// XML-Objekt erstellen (auch myLoader.data statt evt.target.data möglich)
-
// Name der Playlist und Type der Playlist ausgeben
-
"Diese Playlist heißt: "" und ist vom Typ "// Wie viele Videos?
-
"Die Playlist enthält "" Video(s)"; // 3 items
-
-
// Den Titel jedes Videos ausgeben
-
" Name des Videos :""\n";
-
}
-
-
// Item Nr.2 (=1) mithilfe von ..
-
"Video 2 ist vom "// Welche(s) Video(s) von 2006?
-
"Von 2006 sind: ""2006"// Suchergebnisse in einem XMLList-Objekt ablegen
-
"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)
9 Kommentare zum Beitrag "ActionScript3: XML"
Hier noch etwas aus dem Adobe Developer Center:
Filtering XML data in Flash applications using ECMAScript for XML
dankeschön – hast mir gerade sehr geholfen!
ja! Wirklich klasse,
genau das brauch ich grad!
Merci~
besten dank, du hast mich nach einem sehr langen nachmittag vor einem noch längeren abend bewahrt;)
greets
Gerne :-)
Vielen Dank ; )
Vielen Dank! Genau sowas hab ich gesucht. :)
// Wie viele Videos?
trace ("Die Playlist enthält " + myXML.videos.item.length() + " Video(s)"); // 3 items
Eine Klammer ist verutscht :)
Stimmt. Danke für den Hinweis!
Schreibe einen Kommentar