You are on page 1of 8

SimpleXML

Jedino što XML dokument čini onim što jeste, zapravo je njegova struktura. Jedan XML fajl
je, u stvari, običan tekstualni fajl, koji sadrži XML strukturu. To znači da praktično i nije
previše bitan način na koji ćemo taj fajl tretirati, sve dok smo u stanju da iz njega izvučemo
relevantne podatke. Ako imamo jedan tag:

<mojtag>Pozdrav xml</mojtag>

potrebno je da na neki način sistematski izvučemo rečenicu „Pozdrav xml” iz njega. Upravo
ovo, samo ne u tako minimalističkoj formi, rade mnogi sistemi za rad sa XML-om. Jedan od
njih je i klasa SimpleXML.

SimpleXML je jednostavna, ali moćna klasa koja ima mogućnost čitanja, kreiranja,
modifikacije i snimanja XML dokumenata. Funkcioniše tako što kreira SimpleXML objekat iz
nekog izvora (string ili fajl). Zatim je taj objekat dostupan tokom koda, pri čemu sam
objekat predstavlja koreni element dokumenta, a njegovi atributi njegove podelemente.

Na primer:

<mojxml>
<element>
moj prvi element
</element>
<element>
moj drugi element
</element>
</mojxml>

Ako bismo ovaj XML dokument smestili u jedan SimpleXML objekat, njegova struktura bi
izgledala ovako:

SimpleXML objekat bi predstavljao ceo dokument. Odnosno, njegov koreni element


mojxml. Svaki nivo podelemenata bio bi, u okviru ovog objekta, predstavljen kao niz:

Copyright © Link group


Evo kako bi ovaj primer izgledao u pravom kodu:

//Pravljenje xml dokumenta i smestanje u promenljivu xmlTekst


$xmlTekst = <<<XML
<mojxml>
<element>
moj element
</element>
<element>
moj element 123
</element>
</mojxml>
XML;

//Kreiranje SimpleXMLElement objekta xml, na osnovu kreiranog xml


dokumenta xmlTekst
$xml = new SimpleXMLElement($xmlTekst);
//Nakon kreiranog objekta, lako dolazimo do elemenata kroz strukturu
samog objekta
//koja se kreira na osnovu strukture xml dokumenta
echo $xml->element[0];

U primeru smo iskoristili Herodoc string sintaksu. Tako da možete jednostavno kopirati kod
u okruženje. Mnogo češće, XML dokument neće biti vidljiv unutar same funkcionalnosti, već
će doći spolja, kroz string.

Iz primera vidimo da smo inicijalizovali objekat naredbom new SimpleXMLElement().


SimpleXMLElement je centralni objekat klase. Kao konstruktor prosledili smo mu string sa
XML dokumentom, što je i jedini obavezan parametar ovog konstruktora. Pored toga, ovaj
konstruktor prihvata i nekoliko alternativnih parametara:

new SimpleXMLElement($xmlTekst, LIBXML_DTDVALID);

Copyright © Link group


Prvi dodatni parametar konstruktora je option. Konstanta koja aktivira propratnu opciju
prilikom konstrukcije objekta. Ovo su konstante iz libxml biblioteke za rukovanje XML-om.
Listu svih parametara možete naći na sledećoj adresi:

http://www.php.net/manual/en/libxml.constants.php

Ukoliko želimo više opcija, odvajamo ih oznakom |.

Sledeći parametar je data_is_url. Umesto iz stringa, klasa će biti formirana iz dokumenta


sa URL adrese. Naravno, u tom slučaju, i sam izvor mora biti zamenjen izvorom sa veba:

$xml = new SimpleXMLElement("http://mojxmldokument.xml",null,true);

Morali smo da postavimo i drugi parametar, ali samo zato da se PHP ne bi „zbunio” i
„zabrojao” sa parametrima. Treći parametar (true) označava da će XML dokument biti
preuzet sa URL-a.

Poslednji i pretposlednji parametar (ns i is_prefix) tiču se prostora imena dokumenta.


Ukoliko je is_prefix (poslednji parametar) true, odnosno, aktivan, biće uzet u obzir i prostor
imena dokumenta. Ali, samo pod uslovom da je prostor imena naglašen u prethodnom
parametru i adekvatno definisan u samom XML dokumentu:

$xmlTekst = <<<XML
<mojxml xmlns:mojNs="http://mojnamespace">
<mojNs:element>
moj element
</mojNs:element>
<mojNs:element>
moj element 123
</mojNs:element>
</mojxml>
XML;

$xml = new SimpleXMLElement($xmlTekst,null,false,"mojNs", true);


echo $xml->element[1];

Najčešće ćemo XML dokument dobavljati iz fajla.


Na primer:

$xmlTekst = file_get_contents("xmlFajl.xml");
$xml = new SimpleXMLElement($xmlTekst);

Umesto toga, možemo direktno konstruisati objekat funkcijom simplexml_load_file():

$xml = simplexml_load_file("xmlFajl.xml");

U pozadini ove funkcije se ne dogaña ništa drugo do konstrukcija SimpleXMLElement


objekta na već objašnjeni način.

Copyright © Link group


Varijacija funkcije simplexml_load_string() funkcioniše isto, samo što, umesto parametra
prihvata string, a ne fajl:

$xml = simplexml_load_string($xmlTekst);

Kada jednom imamo objekat sa dokumentom, možemo ga čitati kao standardan niz:

for($i=0;$i<sizeof($xml->element);$i++)
echo $xml->element[$i];

ili

foreach($xml as $element)
echo $element;

Kada se jednom domognemo nekog elementa, njegove podelemente možemo pročitati kroz
niz (kao u prethodnim primerima, ali možemo od njega stvoriti zaseban element i tako ga
iščitavati. Jedan od načina da to uradimo je metodom children(). Ovaj metod,
jednostavno, kao rezultat, vraća kompletan niz podelemenata aktuelnog elementa:

$xmlTekst = <<<XML
<izdanja>
<knjiga>
<naslov>Petrova knjiga</naslov>
<autor>Petar Petrovic</autor>
</knjiga>
<knjiga>
<naslov>Jovanova knjiga</naslov>
<autor>Jovan Jovanovic</autor>
</knjiga>
</izdanja>
XML;

$xml = new SimpleXMLElement($xmlTekst);

//$chi = $xml->children();
//echo $chi[0]->naslov;

foreach($xml as $izdanja)
{
$chi = $izdanja->children();
echo "Izdanje: " . $chi[0] . "<br>";
echo "Autor: " . $chi[1] . "<hr>";
}

Naravno, ovaj primer je samo demonstracija. Moglo bi se rešiti i mnogo preglednije:

foreach($xml as $knjiga)
{
echo "Izdanje: " . $knjiga->naslov . "<br>";
echo "Autor: " . $knjiga->autor . "<hr>";
}

Copyright © Link group


Takoñe, kada doñemo do elementa, veoma je jednostavno iščitati njegove atribute. Oni se
nalaze u asocijativnom nizu pod istim objektom.

Ako bismo na primer, želeli da dodamo atribut id svakoj knjizi, dodatak za prethodni kod bi
izgledao ovako:

....
<knjiga id="01">
...
</knjiga>
....
echo "ID: " . $knjiga["id"] . "<br>";
....

Na isti način moguće je dodati i više atributa:

...
<knjiga id="01" isbn="1234567">
...
echo "ID: " . $knjiga["id"] . "<br>";
echo "ISBN: " . $knjiga["isbn"] . "<br>";
...

Pogledajmo kako to izgleda u praksi. Jedan od načina upotrebe XML-a je za kreiranje RSS-a,
odnosno, RSS feed-ova.

Na primer:

http://rss.cnn.com/rss/cnn_world.rss

Ako otvorite ovu adresu u pretraživaču, dobićete sledeću formu strane (sadržaj će biti
različit, jer su u pitanju aktuelne vesti):

Copyright © Link group


Pretraživači imaju ugrañen mehanizam za prepoznavanje RSS feed-ova i obično ih emituju
na ovakav način.

Ako bismo otvorili izvorni kod ovog feed-a, videli bismo zastrašujuću količinu teksta. Ali,
zapravo je u pitanju vrlo jednostavna XML struktura, sa specifičnim osobenostima. Nešto
poput sledećeg:

<rss>
<channel>
<item>
<title></title>
<guid></guid>
<link></link>
<description></description>
<pubDate></pubDate>
</item>
<item>
<title></title>
<guid></guid>
<link></link>
<description></description>
<pubDate></pubDate>
</item>

</channel>
</rss>

Očigledno je da je koreni element dokumenta rss i da je njegov podelement channel, koji u


stvari, sadrži vesti (elementi item). Kada ovo znamo, vrlo jednostavno možemo pročitati i
kontrolisati feed, odnosno, napraviti RSS čitač:

Copyright © Link group


$xml = new
SimpleXMLElement("http://rss.cnn.com/rss/cnn_world.rss",null,true);
foreach($xml->channel->item as $vest)
{
echo $vest->title . "<br>";
echo $vest->description . "<hr>";
}

Naravno, ograničili smo podatke na izlazu na title i description, ali vi možete uneti i ostale
podatke.

Modifikacija XML dokumenta

Do sada smo uspeli da pročitamo XML dokument, ali ne i da intervenišemo na njegovom


sadržaju, odnosno, strukturi.

Ovo bismo, ako želimo da menjamo neki dokument, morali uraditi tako što ćemo
sekvencijalno proveravati sve elemente, jedan po jedan i prepisivati ih u novi dokument sa
eventualnim modifikacijama. Ukoliko kreiramo dokument od početka, ovaj proces se
razlikuje u tome što neće postojati deo sa čitanjem, već samo upis u novi dokument.

Isprva, kreiramo SimpleXML objekat sa korenim elementom:

$xml = new SimpleXMLElement("<izdanja></izdanja>");

Možemo odmah uneti i deklaraciju:

$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-


8\"?><izdanja></izdanja>");

Sada, možemo rukovati kroz ovaj dokument dodajući mu podelemente i atribute:

//DODAVANJE JEDNE KNJIGE


//kreiranje elementa knjiga
$knjiga = $xml->addChild("knjiga");
//dodavanje atributa elementu knjiga (id i isbn)
$knjiga->addAttribute("id","01");
$knjiga->addAttribute("isbn","1234567");
//dodavanje podelemenata knjige
$naslov=$knjiga->addChild("naslov","Petrova knjiga");
$naslov=$knjiga->addChild("autor","Petar Petrovic");
//emitovanje xml-a u string
echo $xml->asXML();

Blok koda (izuzev poslednje linije koja emituje XML u string), možemo ponavljati onoliko
puta koliko imamo podataka.

Iz primera možemo izdvojiti nekoliko novih naredbi (metoda klase SimpleXMLElement):

Copyright © Link group


addChild()
dodaje podelement elementu. Može imati samo jedan parametar (naziv podelementa), dva
parametra (naziv podelementa i njegov sadržaj) ili tri parametra, pri čemu treći parametar
predstavlja prostor imena).

addAttribute()
Dodaje atribut postojećem elementu. Prihvata isti broj i tipove parametara kao i metod
addChild() (naziv, vrednost i prostor imena).

asXML()
Ovaj metod ima dve varijante izvršavanja. U jednoj (ako nema parametara) vraća string
kao rezultat, dok u drugoj varijanti, snima XML u fajl čija je putanja uneta kao parametar
(asXML("mojfajl.xml")), a kao rezultat vraća boolean tip (uspešno ili neuspešno).

Umesto na ovaj način, možete XML dokument kreirati i ručno, pisanjem u string red po red:

$xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><izdanja>";


$xml .= "<knjiga id=\"01\" isbn=\"123456\">";
$xml .= "<naslov>Petrova Knjiga</naslov>";
$xml .= "<autor>Petar Petrovic</autor>";
$xml .= "</knjiga>";
$xml .= "</izdanja>";

Najvažnije iz lekcije:

1. SimpleXML je brza, jednostavna i efikasna biblioteka za rukovanje XML


dokumentima.
2. Osnovna klasa SimpleXML biblioteke je SimpleXMLElement.
3. SimpleXMLElement sadrži jedan XML element ili dokument i sve njegove
podelemente.
4. SimpleXMLElement se inicijalizuje unosom XML dokumenta kao parametra.
5. SimpleXMLElement može biti kreiran i funkcijom simplexml_load_file().
6. Dodavanje elemenata SimpleXMLElement objektu se vrši metodom addChild().
7. Dodavanje atributa SimpleXMLElement elementu, vrši se naredbom addAttribute.
8. SimpleXMLElement objekat se emituje na izlaz u formatu XML dokumenta metodom
asXML().

Copyright © Link group

You might also like