Pe langa metoda clasica de incarcare a variabilelor (.loadVars();), limbajul ActionScript poate comunica si cu fisierele XML (Extensible Markup Language). Nu va voi explica in acest tutorial ce este XML si cum se foloseste. Asta, daca nu stiti, puteti invata de pe w3schools. Insa va voi arata cum ActionScript poate analiza fisierele .xml si voi porni de la un exemplu, pe care il voi explica.
*OBIECTIV: Citirea fisirului XML si stocarea datelor intr-o matrice (array).
I. EXEMPLU:
a. Continutul fisierului xml (il voi numi database.xml)
Aparut in 1984, il are la chitara pe Adrian Smith si pe Bruce Dickinson - voce.
Apare in 1978.
b. Functia care face analiza fisierului database.xml si obiectul XML
function analiza() {
var first_node = this.firstChild; //, primul nod (MENIU)
var albume = new Array();
albume = first_node.childNodes;
for(n in albume) {
ac = albume[n]; //, ac - album curent
if(ac.nodeName <> null) {
nume_album = ac.attributes.nume;
formatie = ac.attributes.formatie;
comentarii = ac.firstChild.nodeValue;
matrice_a = { nume: nume_album,
banda: formatie,
comment: comentarii }
this.info.push(matrice_a);
}
}
}
var xmlFl = new XML;
xmlFl.load('database.xml');
xmlFl.ignoreWhite = true;
xmlFl.info = new Array();
xmlFl.onLoad = analiza;
II. EXPLICATII:
Primul lucru de care trebuie tinut seama este crearea obiectului XML si incarcarea fisierului .xml in el (database.xml):
var xmlFl = new XML;
xmlFl.load('database.xml');
xmlFl.ignoreWhite = true;
xmlFl.info = new Array();
xmlFl.onLoad = analiza;
* var xmlFl = new XML; – „xmlFl” este definit ca un obiect XML
* xmlFl.load(‘database.xml’); – incarca fisierul database.xml in obiect si il pregateste pentru analiza
* xmlFl.ignoreWhite = true; – Versiunile mai vechi ale Flash Playerului vad spatiile din document (\r\n) ca noduri. Pentru a evita acest conflict am setat proprietatea ignoreWhite – true.
* xmlFl.info = new Array(); – matricea in care se vor stoca informatiile extrase din documentul XML.
* xmlFl.onLoad = analiza; – dupa ce termina de pregatit fisierul xml pentru analiza il si analizeaza cu ajutorul functiei analiza. (nu mai e nevoie sa punem paranteze dupa numele functiei in acest caz); * FUNCTIA analiza trebuie sa fie definita inainte de a fi apelata.
Apoi am definit functia „analiza”, care va analiza fiecare nod (tag) al fisierului XML.
*OBS: In unele scripturi o gasiti sub denumirea de parse() sau parsare(), nu conteaza numele.
function analiza() {
var first_node = this.firstChild;
var albume = new Array();
albume = first_node.childNodes;
for(n in albume) {
ac = albume[n];
if(ac.nodeName <> null) {
nume_album = ac.attributes.nume;
formatie = ac.attributes.formatie;
comentarii = ac.firstChild.nodeValue;
matrice_a = { nume: nume_album,
banda: formatie,
comment: comentarii }
this.info.push(matrice_a);
}
}
}
* function analiza() {} – defineste functia.
* var first_node = this.firstChild; – proprietatea firstChild returneaza primul nod dintr-un alt nod sau primul nod din fisier (in exemplu de mai sus va returna MENIU) – first_node – devine un obiect a primului nod.
var albume = new Array();
albume = first_node.childNodes;
Deoarece proprietatea childNodes reprezinta o matrice cu nodurile continute de un anume nod (in cazul nostru first_node, adica MENIU), am definit „albume” ca o matrice.
„Albume” nu este un array, ci un array de obiecte !
for(n in albume) {
ac = albume[n];
if(ac.nodeName <> null) {
nume_album = ac.attributes.nume;
formatie = ac.attributes.formatie;
comentarii = ac.firstChild.nodeValue;
matrice_a = { nume: nume_album,
banda: formatie,
comment: comentarii }
this.info.push(matrice_a);
}
}
Cu ajutorul structurii repetitive for, am verificat toate nodurile ale nodului principal MENIU.
for(n in albume) – n reprezinta un numar al nodului pe care il verifica. Astfel albume[n] – este obiectul nodului n din matrice.
if(ac.nodeName <> null) – in cazul in care nodul curent (ac) este un spatiu, numele lui (proprietatea nodeName) va fi nula (null). Am introdus aceasta conditie pentru a analiza numai nodurile, nu si spatiile (sincer: nu am incredere prea mare in ignoreWhite, de aceea verifica de doua ori).
nume_album = ac.attributes.nume;:
– ac.attributes – reprezinta un obiect care are ca proprietati numele atributurilor nodului ac; => ac.attributes.nume; – returneaza valoarea atributului nome a nodului ac. La fel si pentru formatie = ac.attributes.formatie.
comentarii = ac.firstChild.nodeValue; – ac.firstChild.nodeValue returneaza valoarea dintre taguri.
matrice_a = { nume: nume_album, banda: formatie, comment: comentarii } – matrice_a este o matrice asociativa cu informatii in legatura cu nodul curent.
this.info.push(matrice_a); – this = xmlFl. info – matricea in care vor fi introduse toate datele. metoda push introduce matricea asociativa „matrice_a” in matricea info.
III. REZULTAT
xmlFl.info contine toate infromatiile despre nodurile din matrice astfel:
xmlFl.info[0][‘nume’] – va avea valoarea Powerage;
xmlFl.info[0][‘banda’] – va avea valoarea AC/DC;
xmlFl.info[2][‘comment’] – va avea valoarea dintre tagurile primului nod.
xmlFl.info[2][‘banda’] – va avea valoarea Iron Maiden;