*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;