Parsing di feed RSS con simpleXML

di Gianni Tomasicchio - 16 dicembre 2006

rss dom email simplexml xml

Uno script per leggere RSS 2.0

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:

  • un insieme di tag descriventi il canale (link al sito, autore, lingua, copyright, ecc.);
  • una sequenza di tag <item> contenenti i contenuti veri e propri, insieme ad ulteriori informazioni ad essi associate (autore dell'item, data di pubblicazione dell'item, link alla pagina del sito in cui è pubblicato l'item, ecc.).

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.

Pagine: precedente 1 2 3
Effettua l'accesso o registrati per inserire un commento