Di seguito trovate un'applicazione di tutto quello che abbiamo spiegato fino ad ora. E' uno script che pubblicherà i feed RSS (versione 2.0) forniti da un sito web il cui indirizzo dovrà essere specificato nella configurazione dello script stesso, nella variabile $url_feed. Considerata l'estrema variabilità dei tag usati in un documento RSS si è pensato di preparare uno script in grado di analizzare la fonte (feed) in questione e stampare, tra i tag contemplati nella specifica RSS 2.0, quelli effettivamente impiegati nel particolare documento RSS che si sta elaborando.
In linea di principio un documento RSS è composto da una serie di tag <channel> (di solito uno), ciascuno contiene due tipologie di dati:
Si tenga presente che i tag che un <channel> deve necessariamente contenere sono solo 3 e sono decisamente i più informativi: <title>, <link> e <description>. La lista di tag <item> comunemente presente in <channel> invece non è obbligatoria (benché auspicata). Un tag <channel> senza alcun tag <item> al suo interno sarebbe un pò come una emittente radio senza nessuna trasmissione all'attivo: non molto entusiasmante insomma!
Lo script proposto preleva tutti e tre i tag obbligatori di <channel> per poi mostrarli nella pagina generata. Esso pubblicherà anche tutti gli altri tag possibili per <channel>, allorché essi fosserò effettivamente presenti nel documento RSS.
Per quanto riguarda gli elementi <item> non ci sono invece tag annidati obbligatori (anche se viene consigliato di specificare, come per channel, un title, un link e un description). Lo script quindi valuta di volta in volta la presenza dei tag in questione e li trasforma in elementi di pagina HTML nel caso in cui essi sono effettivamente contenuti nei tag <item> presenti nel documento in analisi.
Ecco lo script e alcuni commenti per una sua più chiara comprensione:
<?php
// indirizzo remoto del feed
$url_feed = "http://www.phpnews.it/index2.php?option=com_rss&feed=RSS2.0&no_html=1";
// array contenente i tag della specifica RSS 2.0 relativi a channel - commentare gli elementi che non si desidera processare
$tags_channel = array("title" => "Titolo feed",
"link" => "URL del sito che distribuisce il canale",
"description" => "Descrizione del canale",
"language" => "Lingua del canale",
"copyright" => "Info copyright",
"managingEditor" => "Email del responsabile editoriale",
"webMaster" => "Email del responsabile del sito",
"pubDate" => "Data creazione del canale",
"lastBuildDate" => "Data ultimo aggiornamento del canale",
"category" => "Alcuni argomenti su cui verte il canale",
"generator" => "Software con cui viene generato il canale",
"docs" => "URL della documentazione sul formato del feed",
"cloud" => "Servizio web che supporti rssCloud per questo canale",
"ttl" => "Minuti prima di eseguire un aggiornamento del canale",
"rating" => "Il PICS per la votazione del canale",
"textInput" => "Specifica un campo input che può essere mostrato con il canale",
"skipHours" => "Info per gli aggregatori indicante quando inibire la lettura",
"skipDays" => "Info per gli aggregatori indicante in che giorni inibire la lettura");
// array contenente i tag della specifica RSS 2.0 relativi a item - commentare gli elementi che non si desidera processare
$tags_item = array("title" => "Titolo item",
"link" => "URL dell'item",
"description" => "Sintesi dell'item",
"author" => "Autore",
"category" => "Categoria dell'item",
"comments" => "URL della pagina contenente i commenti all'item",
"enclosure" => "Descrive un oggetto multimediale allegato all'item",
"guid" => "Stringa che identifica univocamente l'item",
"pubDate" => "Data di pubblicazione dell'item",
"source" => "Il canale RSS dal quale proviene l'item");
// file RSS che si desidera elaborare
$document = simplexml_load_file($url_feed);
// stampa dei tag presenti in channel
foreach($document->channel as $channel)
{
foreach($tags_channel as $key_ch => $desc_ch)
{
// verifica la presenza del tag nella descrizione del canale - se esiste lo stampa
if($channel->$key_ch)
{
echo "<p><b>" . $desc_ch . ":</b> " . htmlentities(utf8_decode($channel->$key_ch)) . "</p>\n";
}
}
echo "<hr />";
echo "<hr />";
// stampa degli item e dei tag in essi annidati
foreach($channel->item as $item)
{
foreach($tags_item as $key_it => $desc_it)
{
if($item->$key_it)
{
// verifica la presenza del tag nell'item - se esiste lo stampa
echo "<p><b>" . $desc_it . ":</b> " . htmlentities(utf8_decode($item->$key_it)) . "</p>\n";
}
}
echo "<hr />";
}
}
?>
Per configurare lo script basta specificare in $url_feed l'URL remoto dell'RSS a cui si intende accedere. Lo script crea poi 2 array ($tags_channel e $tags_item) contenenti i nomi dei tag previsti della specifica RSS 2.0, associando a ciascuno una breve descrizione del loro significato logico da adoperare nella fase di conversione in HTML del feed. Il primo array descrive i possibili tag annidati in <channel> mentre il secondo quelli annidati in <item>.
Caricato il documento RSS con la funzione simplexml_load_file, lo script passa poi a verificare la presenza nel documento dei diversi tag e, nel caso in cui essi siano effettivamente presenti, li stampa avendo cura di fare alcune codifiche sui caratteri (utf8_decode()) ed convertendo i tag HTML (htmlentities()).
Se si ritiene che le informazioni presenti in un particolare feed siano troppo dettagliate, basta commentare le parti superflue dei due array associativi. Questo permetterà di ignorare i tag RSS che non volete siano riconosciuti e stampati dallo script.
Le tecniche di lettura e trasformazione dei documenti XML viste sopra rimangono valide a patto che i documenti su cui viene eseguito il parsing siano completamente aderenti al protocollo XML (o RSS nel caso dello script presentato). Documenti che non sono ben formati o che usano nomi anomali per i tag componenti i documenti possono generare errori nello script e/o risultati inattesi. Conviene quindi verificare preventivamente la validità dei feed a cui si è interessati, adoperando magari uno dei molti servizi presenti in rete. Eccone uno.