Professional Documents
Culture Documents
XMLPHP 03-aLtnKIhE7KpV
XMLPHP 03-aLtnKIhE7KpV
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:
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.
http://www.php.net/manual/en/libxml.constants.php
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.
$xmlTekst = <<<XML
<mojxml xmlns:mojNs="http://mojnamespace">
<mojNs:element>
moj element
</mojNs:element>
<mojNs:element>
moj element 123
</mojNs:element>
</mojxml>
XML;
$xmlTekst = file_get_contents("xmlFajl.xml");
$xml = new SimpleXMLElement($xmlTekst);
$xml = simplexml_load_file("xmlFajl.xml");
$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;
//$chi = $xml->children();
//echo $chi[0]->naslov;
foreach($xml as $izdanja)
{
$chi = $izdanja->children();
echo "Izdanje: " . $chi[0] . "<br>";
echo "Autor: " . $chi[1] . "<hr>";
}
foreach($xml as $knjiga)
{
echo "Izdanje: " . $knjiga->naslov . "<br>";
echo "Autor: " . $knjiga->autor . "<hr>";
}
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>";
....
...
<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):
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>
Naravno, ograničili smo podatke na izlazu na title i description, ali vi možete uneti i ostale
podatke.
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.
Blok koda (izuzev poslednje linije koja emituje XML u string), možemo ponavljati onoliko
puta koliko imamo podataka.
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:
Najvažnije iz lekcije: