info@a-coding-project.de

Verarbeitung von XML-Dokumenten mit ActionScript

Die Beschreibungssprache XML (Extensible Markup Language), deren Potential in Verbindung mit XSL(T), usw. gewaltig ist, erfreut sich immer größerer Beliebtheit und Verbreitung. Dieser Bedeutung trägt Flash seit längerer Zeit Rechnung. Seit der Version 5 ist es nämlich mit ActionScript möglich, mithilfe der zahlreichen Methoden und Eigenschaften des XML - Objekts XML - Daten verhältnismäßig komfortabel zu verarbeiten und zu erzeugen.

XML - Daten laden, interpretieren und manipulieren

ActionScript kann Daten von XML - Dokumenten, welche sich in der gleichen Subdomain wie der Flash film befinden, laden und interpretieren, wobei eine Vielzahl von Methoden und Eigenschaften des XML - Objekts die Navigation durch die Dokumentstruktur erleichtern. Um die Funktionsweise einiger dieser zu demonstrieren, sei das nachfolgende Beispiel angeführt. Um ein XML-Dokument handeln zu können, muss zunächst eine Instanz des XML-Objekts erzeugt und in diese die XML-Daten mithilfe der Objektmethode load("URL") geladen werden. Ein Beispiel:

myXML = new XML();
myXML.load("test.xml");
myXML.contentType = "text/xml";

myXML.onLoad = function(success) 
{
  if (success) 
  {
    showInfos();
  }
  else
  {
    trace("XML-Daten konnten nicht geladen werden.");
  }
}

Hier wird ein neue Instanz my XML des XML - Objekts erzeugt, in welche in der folgenden Anweisung die Daten des XML - Dokuments test.xml geladen werden. Im Anschluss wird ActionScript zudem der Mime-Type der geladenen Daten (text/xml) mitgeteilt.
Mithilfe der Methode onLoad des XML-Objekts wird aufgerufen, sobald die XML - Daten empfangen werden. Die in Verbindung notierte Methode erwartet einen Parameter booleschen Wertes. Wenn das XML - Dokument erfolgreich geladen werden konnte, wird dieser mit dem Wert true belegt, so dass die Funktion showInfos() aufgerufen wird. Andernfalls wird eine Fehlermeldung im Fenster ausgegeben.
Das in diesem Beispiel geladene XML-Dokument besitzt folgende Struktur, wobei hier bewusst auf die Implementierung der Document Type Definition (DTD) verzichtet wurde:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<Sortiment>
 <Artikel nr="1" name="Artikel 1">
  <Infos>
   <Hersteller id="1000" name="Hersteller 1"/>
   <Beschreibung>
        Beschreibung für Artikel 1
   </Beschreibung>
  </Infos>
  <Bestand ist="45" soll="100"/>
 </Artikel>
 <Artikel nr="2" name="Artikel 2">
  <Infos>
   <Hersteller id="1001" name="Hersteller 2"/>
   <Beschreibung>
        Beschreibung für Artikel 2
   </Beschreibung>
  </Infos>
  <Bestand ist="50" soll="50"/>
 </Artikel>
</Sortiment>

Die Funktion showInfos() gibt die Daten einiger ausgewählter Dokumentelemente aus und greift dazu auf einige spezifische Sammlungen und Attribute zurück:

function showInfos()
{
  rootNode = myXML.firstChild;
  trace("Datenbank: " + rootNode.nodeName);
         
  for(myIndex in rootNode.childNodes)
  {
    actNode = rootNode.childNodes[myIndex];
    //Gibt Nr. und Name sämtlicher Artikel aus
    trace("Art.-Nr.: " + actNode.attributes["nr"] + " | " +
          "Art.-Name: " + actNode.attributes["name"]);
                
    //Gibt Herstellername des jeweiligen Artikels aus
    trace("Hersteller: " + 
          actNode.childNodes[0].childNodes[0].attributes["name"]);
  }
}

Im Rumpf der Funktion wird zunächst das Dokument-Element des XML - Dokuments, d.h. das äußerste, alles umfassende Tag mit der Eigenschaft firstChild des XML - Objekts bestimmt und dessen Name, d.h. wiederum dessen Eigenschaft nodeName, ausgegeben. Anschließend werden in einer for..in - Schleife alle Unterknoten (childs) dieses mit rootNode bezeichneten äußersten Knotens durchlaufen, wobei die Attribute nr und name jedes Unterknoten-Elements ausgegeben werden. Zur Bestimmung des jeweiligen Childknotens actNode wird das Element des entsprechenden Indexes (Beginn bei 0!) der Sammlung childNodes (Array von Childknoten) des übergeordneten Knotens rootNode verwendet. Des Weiteren wird mithilfe einer mehrfachen Anwendung von childNodes noch der Name des Herstellers des jeweiligen Artikels, d.h. das Attribut name des Elements Hersteller, ausgegeben.
Natürlich ist es auch möglich, die in ein XML - Objekt geladenen XML - Daten zu manipulieren. So kann man zum Beispiel Werte von Attributen einfach überschreiben:

myXML.firstChild.childNodes[0].attributes["nr"] = 3;
//überschreibt Attribut nr des ersten Artikels

XML - Daten erzeugen

In ActionScript ist es darüber hinaus auch möglich, die Struktur eines geladenen XML - Dokuments zu erweitern, indem man neue Knoten an einer bestimmten Stelle hinzufügt, weitere Attribute für einen Knoten definiert, usw. Selbstverständlich kann man auch ein leerer XML - Objekt erzeugen und eine völlig neue Dokumentstruktur konstruieren. Ein Beispiel für ein derartiges ActionScript :

myXML = new XML();
myXML.contentType = "text/xml";

myNewNode = myXML.createElement("Newstable");
myXML.appendChild(myNewNode);
        
myNewNode = myXML.createElement("News");
myNewNode.attributes.date = "01.01.1999";
myNewNode.attributes.author = "new Author";
myNewNode.attributes.title = "new Title";
myXML.childNodes[0].appendChild(myNewNode);

myNewNode = myXML.createTextNode("Text of the Newsnends here!");
myNewNode.nodeName = "Text";
myXML.childNodes[0].childNodes[0].appendChild(myNewNode);

Dieses Beispiel erzeugt zunächst ein neues XML - Objekt und legt dessen MIME - Type fest. Im Anschluss wird zunächst mithilfe der Methode createElement(ElementName) des XML-Objekts ein neues Element, dessen Name die Methode als Argument erwartet, im Objekt my XML erstellt. Dieser wird mithilfe der Methode appendChild(ChildKnoten) als Childknoten der Childliste des XML - Objekts my XML angehangen. Im Endeffekt repräsentiert dieser den Dokument-Knoten des später aus dem Objekt my XML generierten XML - Dokuments. Im Folgenden wird wiederum ein neues Element namens News mit der Methode createElement erzeugt. Für dieses werden in den drei nachfolgenden Anweisungen die drei Attribute date, author und title mit dem entsprechenden Wert initialisiert bzw. hinzugefügt. Das so erzeugte Element wird in der Childliste von my XML dann unterhalb des zuvor erzeugten Child-Eintrags (Newstable) mit der Methode appendChild angehangen. Diesem Child-Eintrag wird dann ein Textknoten namens Text als Child-Eintrag angehangen. Dieser wurde zuvor mithilfe der Methode createTextNode("Text") erzeugt, wobei der einzufügende Text durch den Parameter Text an die Methode übergeben werden muss.
Das erläuterte ActionScript erzeugt auf diese Weise ein XML - Objekt my XML , dessen XML - Dokumentstruktur wie folgt aussehe:

<Newstable>
 <News date="01.01.1999" author="new Author" title="new Title">
  <Text>Text of the News
  ends here!
  </Text>
 </News>
</Newstable>

Um das erzeugte XML - Objekt in einem XML - Dokument speichern zu können, kann beispielsweise die Methode send("URL" [, Fenster]) des XML - Objekts verwendet werden. Diese codiert das XML-Objekt in ein XML-Dokument und schickt es via POST an die im ersten Parameter angegebene URL, hinter der sich ein serverseitiges Script verbergen kann. Optional kann der Methode noch ein zweiter Parameter Fenster mit den möglichen Werten _self (default), _blank, _parent, _top übergeben werden, welcher angibt, in welchem Frame des Browserfensters die Rückgabe des Scripts auf dem Server erfolgen soll. Ein Beispiel:

myXML.send("test.php","_blank");

In diesem Beispiel würde das durch die Methode send aus dem XML-Objekt my XML generierte XML-Dokument an ein PHP-Script test.php im gleichen Verzeichnis wie der Flash film gesendet werden, welches dann die Speicherung in einer externen XML-Datei auf dem Server vornehmen könnte. Für die Ausgaben des PHP-Scripts ist dann ein neues leeres Fenster (_blank) vorgesehen.

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant