Pisano u PHP
I još po nešto...
RSS feed je opšte poznato, dobra stvar. Koriste ga svi, developeri, blogeri, surferi... E sad, ovo pišem za ovu moju vrstu, prvenstveno za početnike, ali...
RSS, je ustvari formatirani sadržaj sa nekog sajta/bloga/portala... u XML formatu(najprostije receno). Inace ovde možete da prostudirate sve o XML-u, a na W3 gomila primera i objašnjenja. Uglavnom XML je dobar za slanje i čuvanje odredjenih podataka.
Potrebno nam je dalje, cURL u PHP-u moram da napomenem,(podrazumeva se server sa instaliranim PHP-om). Curl(libcurl) je inače biblijoteka(library) i omogućava konektovanje i komuniciranje na server(različitih vrsta) i protokola. Inače dodata je od verzije 4.0 i meni bitno da podržava HTTP, HTTPS protokole, podržava još gomilu ali nisam imao prilika.
Za Linux - ekipu: "instaliranje" libcurl-a
sudo apt-get install php5-curl
a za Win korisnike, dovoljno je u php.ini fajlu da odkomentarišete liniju sa curl-mod ili slično :)
Dakle imamo sa jedne strane PHP sa cURL mogućnostima, a sa druge strane feed koji nam je potreban(razloga ima puno).
$r = curl_init("http://www.nekisajt.com/feed.xml");
Ovom linijom smo inicirali curl, konkretno sa ovom adresom
curl_setopt($r, CURLOPT_RETURNTRANSFER, true);
curl_setopt($r, CURLOPT_HEADERor: #339933;">, 0);
ove dve linije se odnose na konekciju, i prva ima tri parametra: $r tj. resurs sa koga se vuče ranije definisan, drugi parametar je jak o bitan CURLOPT_RETURNTRANSFER, jer podrazumevano libcurl samo šalje podatke i ne čeka odgovor (response), što je dobro u nekim slučajevima, ali kako nam je potreban rss feed moramo da sačekamo odziv kako bi server dozvolio konekciju :), treći parametar je vrednost koja se tiče drugog parametra i ona je bool (true ili false).
Sledeći korak je: izvršiti konekciju, sačekati odziv i zatvoriti. U dve linije koda:
$rss = curl_exec($r);
curl_close($r);
Sada je pola posla urdjeno, ostaje nam manipulacija podacima koje smo pokupili. Sada, postoje razne tehnike za parsovanje XML kao sto su regular exspressions,str_replace i jos po koja, ali sve te tehnike troše resurse malo više, mnogo koda za ništa i od petice(PHP) postoji SimpleXML!
Rad sa SimpleXML je jednostavan i u dokumentaciji ima desetak bibljoteka koje su lepo opisane, nema potrebe za posebnom instalacijom, već je ugradjeno u PHP.
Imamo $rss varijablu koja "nosi" celokupni xml, treba samo pozvati SimpleXML sa dva parametra:
$feed = new SimpleXmlElement($rss, LIBXML_NOCDATA);
Inicijalizovali smo, i prosledili nasu $rss varijablu, LIBXML_NOCDATA je parametar koji da se CDATA tretira kao tekst (više o ovome neki drugi put), može se proslediti i treći parametar koje je bool(true ili false) podrazumevano je false, da se prosledi treći parametar true, $rss bi morao da bude putanja do XML fajla a ne varijabla sa podacima. Tako da cURL nebi bio ni potreban :) teoretski.
Ako vas interesuje šta se dogadja i šta smo ustvari napisali koristite var_dump($feed) ili
print_r($feed);
Sad ide teži deo, pošto neko "pušta" feed u RSS, a neko u ATOM formatu, trebalo bi detektovati na neki način, ovakav recimo:
if(isset($feed->channel))
{
daj_RSS($feed);
}
if(isset($feed->entry))
{
daj_Atom($feed);
}
dobra stvar je ta što RSS ima a ATOM , tako da smo pomoći if proverili koji je ko. Pa shodno tome, pozvana je odgovarajuća funkcija.
RSS funkcija igleda ovako:
function daj_RSS($xml)
{
echo "".$xml->channel->title."";
$cnt = count($xml->channel->item);
for($i=0; $i<$cnt; $i++)
{
$url = $xml->channel->item[$i]->link;
$title = $xml->channel->item[$i]->title;
$desc = $xml->channel->item[$i]->description;
echo ''.$title.''.$desc.'';
}
}
rss je mnogo lakši za čitanje, jer ne sadrži previše atributa u tagovima, dok je sa atom-om situacija malo teža jer moramo da pročitamo atribut:
function daj_Atom($xml)
{
echo "".$xml->author->name."";
$cnt = count($xml->entry);
for($i=0; $i<$cnt; $i++)
{
$urlAtt = $xml->entry[$i]->link->attributes();
$url = $urlAtt['href'];
$title = $xml->entry[$i]->title;
$desc = strip_tags($xml->entry[$i]->content);
echo ''.$title.''.$desc.'';
}
}
Ostaje vam samo da u $r varijablu postavite neki link i testirate.




nenadsky
Врло елегантно решено. Јел ово наставак Spy RSSa? :D
miff
Pa vrlo verovatno, mada sve manje imam vremena...
mangup
Odlican PHP primer za parsiranje XML-a.
ipasoft
nije bas za pocetnike, ali je veoma razumljivo.
sam kad bi font bio manje zelen u "code", oci mi ispadose od toliko kontrasta...
miff
@ivice pa zato je kontrastno da ti se ureze u pamcenje ;)
Bar ja tu tehniku brzog ucenja koristim :D