Najlepszym przykładem na wykorzystanie RSS niech będzie ramka po prawej stronie gdzie można odnaleźć najnowsze artykuły z DevShed.com, oraz plik RSS z najnowszymi artykułami z WebDeveloper.pl:
http://webdeveloper.pl/rdf/webdeveloper.rss.
RSS jak każdy inny plik XML zbudowany jest hierarchicznie z wykorzystaniem kilku standardowych znaczników.
Oto przykład pliku RSS:
<?xml version="1.0" encoding="iso-8859-2"?> <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd"> <rss version="0.91"> <channel> <title>WebDeveloper.pl</title> <link>http://webdeveloper.pl</link> <description>WebDeveloper.pl - Dynamiczne Strony WWW</description> <language>pl</language> <item> <title>Klasy i PHP</title> <link>http://webdeveloper.pl/html/news/2001/06/15/220.html</link> <description>Klasy to nic innego jak zbiór zmiennych i funkcji, które na nich operują. Klasy pozwalają na zdefiniowanie i opisanie obiektów, które istnieją i funkcjonują w realnym świecie. Obiekt lub egzemplarz klasy "żyje" jako struktura pochodna danej klasy. </description> </item> <item> <title>Przechowywanie danych binarnych w bazie danych MySqltitle> <link>http://webdeveloper.pl/html/news/2001/06/14/213.html</link> <description>Dość często spotykam się z problemem przechowywania plików binarnych (np. obrazków) w sposób dający łatwo nimi zarządzać, wyszukiwać i udostępniać. Jednym z rozwiązań tego problemu może być przechowywanie plików w bazie danych korzystając z pola typu BLOB. Jakiś czas temu na stronach WebDeveloper.pl pojawił się tekst opisujacy podobny problem, lecz nie poruszał tematu zbyt dogłębnie. Mam nadzieję, że ten artykuł wyjaśni kilka niejasności. </description> </item> </channel> </rss>
Struktura RSS Plik RSS rozpoczyna się od informacji, iż jest to dokument XML:
<?xml version="1.0"? encoding="ISO_8859-2">
Następnie zawiera deklarację typu dokumentu oraz arkusza DTD:
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" http://my.netscape.com/publish/formats/rss-0.91.dtd">
Teraz właściwe dane dotyczące naszego kanału umieszczamy w znacznikach <channel>....</channel>:
<title>...</title> - tytuł kanału, serwisu
<description>...</description> - charakterystyka serwisu
<link>...</link> - link do serwisu
<language>...</language> - określenie wersji językowej
<copyright>...</copyright> - prawa autorskie
<pubDate>...</pubDate> - data wygenerowania pliku RSS
Specyfikacja RSS przewiduje również użycie znacznika textinput, który pozwala umieścić w kanale formularz umożliwiający przesyłanie zapytań do strony wystawiającej RSS oraz znacznik image zawierający informację o logo witryny.
Wreszcie najważniejsza rzecz dla nas czyli treść. Każda wystawiana informacja zawiera się między znacznikami <item>...</item>. W pliku kanału może znajdować się maksymalnie 15 pozycji, każda składająca się z:
<title>...</title> - tytuł artykułu
<link>...</link> - bezpośredni link do artykułu na stronie domowej kanału
<description>...</description> - krótkie wprowadzenie do artykułu
Generowanie i parsowanie plików RSS Do generowania i parsowania plików RSS polecam pakiet phpChannel (dostepny w dziale Download).
Dokładny opis jak generować własny plik RSS na podstwie zawartości bazy danych oraz parsować plik ściągnięty z innej witryny znajduje się w pliku INSTALL, tu przedstawię krótki skrypt, pozwalający na szybkie wstawienie zawartości zdalnego kanału do własnej strony.
Skrypt ściągający plik RSS co pewnien czas (tutaj co 3600 sek), przetwarzający go na listę z odnośnikami i zapisujący wynikowy kod (HTML) jako plik używany do dołączania do własnej strony (np. poprzez include("/tmp/rss.inc")) <? // co wstawiamy przed linkiem $link_prefix = "<li><font size=-2>"; // co wstawimy za linkiem $link_postfix = "<br>\n"; // plik buforujący, w którym przechowujemy wynikowy kod kanału, // plik MUSI mieć prawo do zapisu dla procesu generującego go (serwer www) $cache_file = "/tmp/rss.inc"; // co jaki czas pobieramy plik RSS (w sek) $cache_time = 3600; // ilość pozycji w kanale $max_items = 10; // artykuł otwiera się w nowym oknie $target = "_blank"; // lokalizacja pliku RSS $backend = "http://webdeveloper.pl/rdf/webdeveloper.rss"; $items = 0; $time = split(" ", microtime()); srand((double)microtime()*1000000); $cache_time_rnd = 300 - rand(0, 600); if ( (!(file_exists($cache_file))) || ((filectime($cache_file) + $cache_time - $time[1]) + $cache_time_rnd < 0) || (!(filesize($cache_file))) ) { $fpread = @fopen($backend, 'r'); if(!$fpread) { echo "nie mogę połaczyć się z witryna<br>\n"; exit; } else { $fpwrite = fopen($cache_file, 'w'); if(!$fpwrite) { echo "nie mogę zapisać pliku buforujacego<br>\n"; exit; } else { while(! feof($fpread) ) { $buffer = ltrim(Chop(fgets($fpread, 256))); if (($buffer == "<item>") && ($items < $max_items)) { $title = ltrim(Chop(fgets($fpread, 256))); $link = ltrim(Chop(fgets($fpread, 256))); $description = ltrim(Chop(fgets($fpread, 256))); $title = ereg_replace( "<title>", "", $title ); $title = ereg_replace( "</title>", "", $title ); $link = ereg_replace( "<link>", "", $link ); $link = ereg_replace( "</link>", "", $link ); fputs($fpwrite, "$link_prefix<A HREF=\"$link\" TARGET=\"$target\">$title</A>$link_postfix"); $items++; } } } fclose($fpread); } fclose($fpwrite); } if (file_exists($cache_file)) { include($cache_file); } ?>