Parsarea XML-urilor este o parte integranta a dezvoltarii web, fie ca este vorba de implementarea unui protocol de comunicatie, de citirea unui fisier RSS sau generarea unui feed pentru iTunes. In mod cert, mai devreme sau mai tarziu, toti programatorii PHP se lovesc de aceasta problema, ce nu se rezuma neaparat la necesitatea de a parsa un fisier XML, ci si care este cea mai optima si facila metoda.
Din fericire, in afara numeroaselor imbunatatiri legate de modelul obiectelor, exceptii si alte lucruri dragute, PHP5 cuprinde o serie de functii create tocmai pentru acest scop: parsarea documentelor XML. Dintre acestea se remarca o biblioteca cunoscuta sub numele de simpleXML, ale carei facilitati sunt mai mult decat suficiente pentru a acoperi procesarea de baza a XML-urilor.
SimpleXML cuprinde functii de citire a documentelor XML, de extragere a informatiilor din acestea, de comparare si inlocuire a nodurilor, s.a.m.d., pe care le poti utiliza cu succes in scripturile tale, cu un efort minim.
Acestea fiind spuse, sa trecem la treaba!
Incarcarea documentelor cu simplexml_load_file()
Pentru a putea citi continutul unui fisier XML, acesta trebuie mai intai deschis. Pentru aceasta, PHP iti pune la dispozitie functia simplexml_load_file, care, dupa cum ii spune si numele, are rolul de a accesa un fisier XML si de a-l incarca in memorie. Prototipul functiei este urmatorul:
object simplexml_load_file ( string $cale_fisier [, string $nume_clasa = "SimpleXMLElement")*
*In afara celor prezentati mai sus, simplexml_load_file are inca 3 parametrii optionali, pe care insa nu ii voi discuta aici.
Dupa cum poti observa, primul parametru reprezinta calea catre fisierul XML pe care vrei sa-l accesezi, iar cel de-al doilea, $nume_clasa, este denumirea tipului de obiect pe care vrei sa-l returneze functia. Desigur, PHP impune o restrictie in acest sens, si anume faptul ca obiectul returnat trebuie sa fie un tip derivat (adica o clasa mostenita) din SimpleXMLElement.
Sa vedem cum lucreaza aceasta functie. Pentru exemplul de mai jos, am presupus ca vrei sa parcurgi un fisier XML cu urmatorul continut:
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
<title>GRAFICA 2D</title>
<description>GRAFICA 2D</description>
<link>http://www.e-learn.ro/tutoriale.htm</link>
<language>ro</language>
<copyright>Copyright 2008-2009 E-LEARN.ro.</copyright>
<item>
<title> </title>
<description> </description>
<link> </link>
<guid> </guid>
</item>
<item>
<title> </title>
<description> </description>
<link> </link>
<guid> </guid>
</item>
<item>
<title></title>
<description> </description>
<link> </link>
<guid></guid>
</item>
</channel>
</rss>
Acesta reprezinta o portiune dintr-un RSS cu tutoriale de pe e-learn.ro. Dupa cum poti observa, fiecare tag <item> reprezinta un tutorial cu titlu (<title>), descriere (<description>) si link (<link> si <guid>).
Sa presupunem ca vrei sa parcurgi acest document si sa afisezi titlul si linkul acestui RSS. Pentru aceasta, salveaza codul de mai sus intr-un fisier cu denumirea exemplu.xml, si scrie urmatorul cod intr-un fisier .php din acelasi director cu xml-ul tau:
<?php
if(!$xml = simplexml_load_file('exemplu.xml')){
trigger_error('Eroare la citirea fisierului',E_USER_ERROR);
}
foreach($xml as $channel){
echo $channel->title."<br>";
echo $channel->link;
}
?>
Dupa cum poti observa, continutul fisierului exemplu.xml este incarcat in variabila $xml, apoi tag-urile acestuia sunt accesate ca proprietati ale obiectelor utilizand notatia ->.
Rezultatul executiei scriptului de mai sus este:
GRAFICA 2D
http://www.e-learn.ro/tutoriale.htm
Accesarea nodurilor ca elemente ale unui array
Dupa cum poti observa in codul xml de mai sus, elementul <channel> contine mai multe elemente <item>, care reprezinta de fapt tutorialele. Sa presupunem ca vrei sa afisezi toate tutorialele sau sa cauti un anumit tutorial. Cum faci?
Din fericire, incarcarea unui XML cu functia simplexml_load_file() presupune ca nodurile acestuia pot fi accesate ca array-uri de elemente. Pentru a demonstra aceasta functionalitate, iata cum am afisat titlul primului tutorial din lista:
<?php
if(!$xml = simplexml_load_file('exemplu.xml')){
trigger_error('Eroare la citirea fisierului',E_USER_ERROR);
}
echo 'Titlul este...<br />';
echo $xml->channel->item[0]->title;
?>
Acest script va afisa:
Titlul este...
Cum sa desenezi un cos de cumparaturi vectorial
Dupa cum am precizat si mai sus, odata ce continul fisierului a fost incarcat, scriptul localizeaza titlul primului tutorial utilizand urmatoarea sintaxa:
echo $xml->channel->item[0]->title;
Daca privesti expresia de mai sus, poti observa ca primul tutorial, ce este de fapt un element <item>, este localizat ca proprietate ca elementului <channel> prin indicele 0 (item[0]), apoi este afisat titlul prin apelarea proprietatii title (item[0]->title).
Deci, extensia simpleXML iti permite sa accesezi noduri dintr-un fisier xml utilizand aceeasi sintaxa ca pentru array-uri.
Utilizand acelasi fisier exemplu.xml, iata cum poate fi afisata descrierea ultimului tutorial din lista:
<?php
if(!$xml = simplexml_load_file('exemplu.xml')){
trigger_error('Eroare la citirea fisierului',E_USER_ERROR);
}
echo 'Descrierea ultimului tutorial este...<br />';
echo $xml->channel->item[2]->description;
?>
In acest mod, intregul proces de localizare a unui nod se reduce la parcurgerea xml-ului de la radacina.
Cam atat deocamdata despre simpleXML. Sper ca acest tutorial sa iti fie de folos pentru parcurgerea si citirea informatiilor dintr-un fisier xml simplu.
|