XML inladen in Flash MX (of MX 2004)!

 

Inleiding:

In mijn zoektocht om XML in te leren laden in Flash kwam ik alleen Engelstalige tutorials tegen, en ik vond ze zelfs niet allemaal even duidelijk.

Na veel proberen heb ik eindelijk de basis te pakken, en deze ga ik delen met jullie! :)

 

XML basis:

Xml zelf is heel erg simpel, zoals je nu hier zult zien.

 

<kleuren>

     <kleurtjes kleur='bruine'>

       <fel>Ja</fel>

     </kleurtjes>

     <kleurtjes kleur='witte' />

     <kleurtjes kleur='groene' />

     <kleurtjes kleur='gele'>

       <vrolijk>Ja</vrolijk>

       <fel>nee</fel>

     </kleurtjes>

</kleuren>   

 

Dit kan waarschijnlijk iedereen begrijpen, we defineren een lijst van kleuren, die bestaat uit kleurtjes die allemaal een kleur hebben!

Sommige kleurtjes hebben ook nog waardes als vrolijk of fel.

Zoals je ziet worden de kleurtjes die geen verdere waarde dan kleur hebben meteen weer afgesloten door in de begin-tag alweer te sluiten dmv />.

Je kunt nu ook meteen zien dat het overzichtbaar houden van XML tags ook verstandig is, dus met inspringen werken telkens als je binnen een object iets nieuws defineert.

Je XML bestand moet in dezelfde map staan als je .swf, of je moet bij de path van je XML aangeven dat hij in een andere folder staat, helaas kan Flash nog steeds niet raden waar je je XML bestand hebt geplaatst.

XML maakt gebruik van de zogeheten parent-child structuur. Dit kan het best uitgelegd worden aan de hand van dit voorbeeld:

 

<grootouders>

     <ouders>

         kind1

     </ouders>

     <ouders>

         kind2

     </ouders>

</grootouders>

 

Alle ouders zijn kinderen van grootouders, en alle kinderen zijn kinderen van hun ouders.

Belangrijk: Wat tussen <tags>en</tags> staat, is dus een kind van die tags, en geen attribute!

 

Flash basis:

Om je xml in flash in te laden hoef je helemaal niet zo veel moeite te doen. Het enige wat je hoeft te doen is:

 

xmlload = "eerstexmltest.xml";

test = new XML();

test.load(xmlload);

 

En voila! Je hebt je eerst xmlbestand in Flash ingeladen. Wat dus helemaal niet zo moelijk is, nu zit je er alleen nog mee dat je niks met de ingeladen waarden kunt. Dit gaan we nu behandelen.

 

Flash + XML eindelijk samen!

We gaan nu de ingeladen XML pagina in Flash output geven! Om er voor te zorgen dat als je begint met de XML pagina aan te roepen moeten we eerst ervoor zorgen dat alles is ingeladen voordat Flash begint, dit doen we dmv de onLoad parameter.

 

xmlload = "eerstexmltest.xml";

test = new XML();

test.onLoad = function(succes){

   if(succes){

      trace(“Het is gelukt!”);

   }

   else {

      trace(“inladen mislukt!”);

   }

}

test.load(xmlload);

 

Dit laat wanneer het inladen van je XML is gelukt “Het is gelukt!” zien. Alleen willen we natuurlijk wel meer laten zien dan of het inladen is gelukt.

 

xmlload = "eerstexmltest.xml";

test = new XML();

test.onLoad = function(succes){

   if(succes){

         infoover = this.firstChild.nodeName;

        trace(infoover);

   }

   else {

      trace(“inladen mislukt!”);

   }

}

test.load(xmlload);

 

Deze geeft dan de output: kleuren. Wat de eerste tag van je eerstxmltest.xml bestand is. (Of als je al met je eigen .xml bestand bent begonnen krijg je natuurlijk een andere output).

This.firstChild.nodeName    firstChild is, als vanzelfsprekend, het eerste ‘kind’ van je .xml bestand, oftewel de eerste tag.

                                              nodeName geeft de naam van de node aan, oftewel wat er tussen de < en > staat.

 

Dit begint er al meer op te lijken! Nu gaan we de kleuren outputten in een textveld dat we hebben aangemaakt (ik adviseer een groot textveld zodat we alles in een keer kunnen zien, zodat we niet met scrollbars e.d. hoeven te werken.

 

xmlload = "eerstexmltest.xml";

test = new XML();

test.ignoreWhite = true;

test.onLoad = function(succes){

   if(succes){

         infoover = this.firstChild;

         kleuren = infoover.childNodes;

         for(i in kleuren){

              test = kleuren[i].attributes;

              tekstveld.text += test.kleur + "\n";

         }

   }

   else {

      trace(“inladen mislukt!”);

   }

}

test.load(xmlload);

 

Nu hebben we al nuttige output! We gaan weer even langs de code:

Er is een belangrijke regel bijgekomen: test.ignoreWhite = true. Deze regel zorgt er voor dat elk wit stuk in het xml bestand (tabs/spaties) word genegeerd als informatie, de spaties tussen <test>e n</test> worden wel bewaard.

De variabele infoover wordt weer de naam van de eerste tag in het XML bestand.

‘kleuren’                                         wordt een array van alle kinderen van infoover. Oftewel alle kleuren!

for(i in kleuren)’                            dit doorloopt alle waarden in de array kleuren. (Pas op! Dit gaat de array wel van achter naar voor af!)

test = kleuren[i].attributes’          de variabele test wordt een object die alle attributes van kleuren[i] bevat. En kleuren[i] is telkens 1 childNode van infoover.

tekstveld.text += test.kleur’          Aan de text van het tekstveld wordt de waarde kleur van het object test toegevoegd, wat dus staat voor de attribute van een van de childNodes van infoover.

 

Nu gaan we nog iets verder, we willen ook nog de informatie die tussen de <kleurtjes> tags staat toevoegen.

Eerst moeten we kijken of de childNode van <kleuren> zelf childNodes heeft. Dit doen we met de hasChildNodes(); functie.

En dan willen we de naam nog van die childNode opvragen, dat doen we met nodeName. En de informatie opvragen die tussen die tags staan vragen we op met nodeValue! Pas op! nodeName zit een niveau hoger dan nodeValue! Dit zullen we dadelijk in het voorbeeld zien.

 

xmlload = "eerstexmltest.xml";

test = new XML();

kleuren = new Array();

test.ignoreWhite = true;

test.onLoad = function(succes){

     if(succes){

         kleureninfo = this.firstChild;

         kleuren = kleureninfo.childNodes;

         infoover = this.firstChild.nodeName;

         for(i in kleuren){

              test = kleuren[i].attributes;

              tekstveld.text += test.kleur + " " + infoover +"! \n";

              if(kleuren[i].hasChildNodes()){

                   for(j in kleuren[i].childNodes){

                        stukjes = kleuren[i].childNodes[j];

                        tekstveld.text += "  "+stukjes.nodeName+": "                                         +stukjes.firstChild.nodeValue                                        + "\n";

                   }

              }

         }

     }

     else {

         tekstveld.text = "inladen van: . " + xmlload + " is niet gelukt!";

     }

}

test.load(xmlload);

 

 

 

//negeer de witte stukjes

 

 

 

 

 

//Test krijgt dezelfde waarden als de atrributes van kleuren[i]

//als kleuren[i] childNodes heeft:

//voor elke waarde van J die geldig is in kleuren[i].childNodes[j]

//stukjes krijgt de waarde van kleuren[i].childNodes[j]

//aan tekstveld.text wordt de naam van stukjes toegevoegd, en de waarde van het kind van deze node.

 

Dit is het laatste voorbeeld. En omdat deze iets uitgebreider is, is de uitleg ernaast gegeven.

Ik zal nog even alle xml-tags die je gebruikt met het uitlezen van XML bestanden uitleggen:

 

firstChild

Het eerste kind van een object, als je deze los gebruikt in de onLoad geeft het het hele XML bestand terug

nodeName

Geeft de naam van het gespecificeerd xml object terug.

Vb. this.firstChild.nodeName geeft de naam de eerste tag in het XML bestand.

hasChildNodes()

Geeft true of false terug. Als het xml bestand childNodes heeft geeft het true terug.

nodeValue

Geeft de waarde terug van de informatie die tussen de tags staat.

nodeType

Geeft 1 of 3 terug, 1 als de gespecifeceerde node een xml-object is, en 3 als de node tekst is.

atrributes

Geeft alle attributes van een node terug. Deze attributes zijn alleen aan te roepen met de naam die in het XML bestand zelf is gebruikt.

childNodes

childNodes is een array van alle childNodes van een bepaald object. Vb. this.firstChild.childNodes geeft een array terug met alle waardes van de nodes tussen de eerste tags van het XML bestand.

Dus this.firstChild.childNodes[0] =

“<kleurtjes kleur='bruine'><vrolijk>nee</vrolijk></kleurtjes>”

Als je XML bestand gebruik boven in deze pagina.

Bedankt voor het lezen van deze tutorial!

Klik hier als je een punt wil geven. (wat zeer waardeert wordt!)