Cu functiile ActionScript 3 specifice E4X poate fi accesata si folosita orice data dintr-un continut XML, cum ar fi: numele tag-urilor, textul din ele, atributele si valorile lor, comentarii sau instructiuni de procesare.
E4X ofera 2 seturi generale de instrumente pentru accesarea datelor dintr-un format XML:
// Instanta in care e stocat continutul XML complet var poze:XML = <imglist> <image id="1"> <url>dir/img1.jpg</url> <title>Titlu img1</title> </image> </imglist>; // Adauga in "datexml" (zona de Text din Scena) date din XML datexml.text = 'Tag radacina: '+ poze.name(); // Numele tag-ului radacina datexml.text += '\n ID imagine: '+ poze.image.@id; // Valoarea atributului 'id' in <image> datexml.text += '\n Url: '+ poze.image.url; // Datele tag-ului <url> datexml.text += '\n Titlu imaginii: '+ poze.image.title; // Datele tag-ului <title>- Se foloseste '+=' pentru a adauga valoarea de dupa egal (=) la cele deja existente; '\n' adauga un rand nou.
Cu formula obiect.* se obtin toate elementele (tag-urile) din "obiect", iar cu @* se obtin valorile tuturor atributelor din tagul la care e aplicata.
3. Dupa ce se apasa "Ctrl+Enter", va rezulta urmatoarea prezentare Flash:// Instanta in care e stocat continutul XML complet var poze:XML = <imglist> <image id="1"> <url>dir/img1.jpg</url> <title>Titlu img1</title> </image> </imglist>; // Adauga in "datexml" (zona de Text din Scena) date din XML, preluate prin metode datexml.text += 'Tag radacina: '+ poze.localName(); // Numele tag-ului radacina // Valoarea atributului 'id' al primului element copil (<image>) in radacina datexml.text += '\n ID imagine: '+ poze.children()[0].attribute('id'); // Datele din elementul <url> al primului obiect-copil (<image>) in radacina datexml.text += '\n Url: '+ poze.children()[0].child('url'); // Datele din al doilea element ([1] <title> ) al primului obiect-copil (<image>) in radacina datexml.text += '\n Titlu imaginii: '+ poze.children()[0].children()[1];- Acest cod returneaza si afiseaza in prezentarea Flash aceleasi date ca exemplu precedent, in imaginea de sus.
Cu metoda length se poate prelua numarul de tag-uri sau atribute dintr-un element.
De ex.:
trace(poze.image.*.length()); // 2 (nr. tag-uri incluse in <image>)
trace(poze.image.attributes().length()); // 1 (nr. atribute din <image>)
O instructiune destul de utila in E4X este accesorul doua-puncte (..), care da posibilitatea accesarii directe a tuturor descendentilor dintr-un obiect (noduri copil, nepot, stranepot, ...).
Cu operatorul accesor (..) se obtine o lista cu toate elementele sau atributele cu un anumit nume din toti descendentii inclusi in obiectul la care e aplicat.
Clasa XMLList are si o metoda echivalenta la acest operator, denumita descendants(), care functioneaza in acelasi mod, dar pt. atribute trebuie adaugata si metoda "attribute()".
// Instanta in care e stocat continutul XML complet var poze:XML = <imglist> <image id="1"> <url>dir/img1.jpg</url> <title>Titlu img1</title> </image> <image id="2"> <url>dir/img2.jpg</url> <title>Titlu pt. img2</title> </image> </imglist>; trace(poze..title); // sau trace(poze.descendants('title')); /* Returneaza toate tag-urile <title> aflate in oricare descendent in "poze" <title>Titlu img1</title> <title>Titlu pt. img2</title> */ trace(poze.descendants().attribute("id")); // sau trace(poze..@id); // Returneaza 12 (valoarea atributelor "id" aflate in fiecare descendent in "poze") // Se obtine al doilea atribut "id" trace(poze..@id[1]); // 2- Expresia dupa 'sau' arata echivalentul prin care se obtine acelasi rezultat.
In continutul XML , pe langa datele din tag-uri si atribute, pot fi adaugate Comentarii si Instructiuni de porocesare.
Comentariile sunt cele adaugate cu sintaxa:
<!-- Comentariu -->
Instructiunile de procesare sunt adaugate cu formula:
<?app Date cu Instructiuni ?>
- Instructiunile de procesare sunt in general fragmente de cod care trebuie executate pe server. De exemplu, pt. PHP ar fi: <?php Cod PHP ?>
Aceste doua forme de date auxiliare pot fi accesate utilizand metodele clasei XMLList: comments() (pt. comentarii) si processingInstructions() (pt. instructiuni de procesare). Ambele metode returneaza o lista cu aceste elemente.
In mod implicit (default), parser-ul E4X ignora aceste tipuri de date, astfel, pentru a le face accesibile trebuie specificate proprietatile: ignoreComments (pt. comentarii) si ignoreProcessingInstructions (pt. instructiuni de procesare) cu valoare false. Ambele se aplica direct la clasa XML.
XML.ignoreComments = false;
XML.ignoreProcessingInstructions = false;
// Se activeaza recunoasterea comentariilor si instructiunilor de procesare XML.ignoreComments = false; XML.ignoreProcessingInstructions = false; // Instanta in care e stocat continutul XML complet var marplo:XML = <site> <!-- https://marplo.net --> <?php Instructiuni procesare cod PHP ?> <!-- Cursuri si Tutoriale --> <cursuri> <curs id="1" title="PHP-MySQL">marplo.net/php-mysql/</curs> <curs id="2" title="JavaScript">marplo.net/javascript/</curs> <curs id="3" title="FlashActionScript">marplo.net/flash/</curs> </cursuri> <?php Cod PHP ?> </site>; // Preia in 2 variabile comentariile si instructiunile PHP aflate direct in root (tagul <site>) // Variabilele sunt de tip Object deoarece si datele sunt preluate cu acest tip var coms:Object = marplo.comments(); var insp:Object = marplo.processingInstructions(); // Adauga primul Comentariu si a doua Instructiunea in 'datexml' datexml.text = coms[0]; datexml.text += '\n'+ insp[1];- Observati ca variabilele "coms" si "insp" sunt definite ca tip "Object", deoarece in E4X datele sunt preluate si stocate ca obiecte, cu indexare numerica (de la 0, precum la Array), de aceea se folosesc indexi [0], [1] pentru accesarea separata a fiecaruia.
Daca sunt comentarii si instructiuni in alte tag-uri incluse in cel radacina, acestea pot fi preluate cu operatorul accesor (..) sau metoda "descendants()", cu formula:
instanta_xml..*.comments()
instanta_xml.descendants().processingInstructions()
- Acestea nu preia si pe cele incluse direct in tag-ul radacina.
O alta abilitate importanta pe care o are E4X este posibilitatea de a filtra datele dintr-un obiect XMLList.
Filtrarea se face cu sintaxa:
elemente_XMLList.(expresie_conditionala)
- "elemente_XMLList" reprezinta tag-urile si atributele dintr-un obiect XMLList
- "expresie_conditionala" sunt instructiuni conditionale prin care se returneaza doar elementele care indeplinesc acea conditie.
Deoarece filtrarea se aplica la obiecte de tip XMLList, datele XML trebuie mai intai adaugate intr-o instanta XMLList
// Instanta in care e stocat continutul XML complet var marplo:XML = <site> <!-- https://marplo.net --> <?php Instructiuni procesare cod PHP ?> <!-- Cursuri si Tutoriale --> <cursuri> <curs id="1" title="PHP-MySQL">marplo.net/php-mysql/</curs> <curs id="2" title="JavaScript">marplo.net/javascript/</curs> <curs id="3" title="FlashActionScript">marplo.net/flash/</curs> </cursuri> <?php Cod PHP ?> </site>; // Se creaza un obiect XMLList ce contine toate elementele din <site> var site:XMLList = marplo.* // Se obtin doar tag-urie "curs" care au atributul id>1 var elms:XMLList = site.curs.(@id>1); trace(elms); /* In Output va afisa: <curs id="2" title="JavaScript">marplo.net/javascript/</curs> <curs id="3" title="FlashActionScript">marplo.net/flash/</curs> */ // Se obtine doar tag-ul care are in text cuvantul "flash" var tag1:XMLList = site.curs.(text().search("flash") != -1); trace(tag1); // marplo.net/flash/ // Se obtine atributul "title" aflat in tag-ul care are id<3 si in textul din tag cuvantul "php" var tag2:XMLList = site.*.(@id<3 && text().search("php") != -1).@title; trace(tag2); // PHP-MySQL- Expresia "site.curs.(@id>1)" returneaza elementele din tag-ul <curs> care au atributul "id" mai mare decat 1.
Observati ca se pot face filtrari destul de complexe pt. a obtine exact elementele cautate. Dar pentru a filtra o lista in care nu toate tag-urile au atributul sau elementul copil specificat in conditia de filtrare, trebuie folosita metoda hasOwnProperty(), pentru a verifica existenta acelui atribut sau tag-copil. Altfel, returneaza eroare.
De exzemplu, urmatorul cod returneaza toate elementele din "un_xml" care au atributul "nr" mai mare decat 7.
un_xml..*.(hasOwnProperty("@nr") && @nr>7)
<input type="checkbox" name="a_name" value="value" checked="checked" />
#id { background:url("path_to_image.png"); background-size:contain; background-repeat:no-repeat; }
var rest8_7 = 8 % 7; alert(rest8_7);
$nr = ceil(3.5); echo $nr; // 4
Alex wants to buy a bike. - Alex vrea sa cumpere o bicicleta.
LeĆ unos libros. - Am citit niste carti.