PHP: combinare XMLReader con SimpleXML

La classe XMLReader di PHP è molto performante ma purtroppo non possiede la stessa intuitività della classe SimpleXML. Possiamo tuttavia combinare le due classi per avere il meglio dei due approcci. In questo articolo useremo come esempio un feed RSS remoto.

Il feed è quello dei miei articoli sul blog di Html.it. Ho scelto questo sito perchè ci permette di ricreare lo scenario di un'inclusione di dati da siti di terze parti.

Il codice, ampiamente commentato, è il seguente:


$i = 0;
$html = '';

$xmlReader = new XMLReader(); // Instanziamo la classe XMLReader
$xmlReader->open('http://blog.html.it/author/gabroman/feed/'); // Apriamo l'URL del documento XML

while($xmlReader->read()) { // Inizia il loop sugli elementi XML e la lettura del documento

	if($xmlReader->nodeType == XMLReader::ELEMENT) { // Se l'elemento è un nodo elemento, allora continuiamo
		
		if($xmlReader->localName == 'item') { // Se l'elemento è item, allora...
		
		    $xmlNodeString = $xmlReader->readInnerXML(); // Salva tutto il contenuto del nodo come stringa
		    
		    $xmlBefore = '<?xml version="1.0"?><document>'; // Assembliamo una stringa XML ben formata
		    $xmlAfter = '</document>';
		    $xmlString = $xmlBefore . $xmlNodeString . $xmlAfter;
		    
			$xml = simplexml_load_string($xmlString); // Passiamo la stringa XML e otteniamo un oggetto
			
			$html .= '<div>' . "\n";
			$html .= '<h2><a href="' . $xml->guid . '">' . $xml->title . '</a></h2>' . "\n";
			$html .= '<p>' . $xml->description . '</p>' . "\n";
			$html .= '</div>' . "\n";
			
			$xmlReader->read();  // Passiamo all'elemento successivo
		}
				
	}
	
	$i++;  // Incrementiamo il contatore del loop
}
$xmlReader->close(); // Fine della lettura del documento XML

echo $html;

L'unico inconveniente è che la stringa da passare a SimpleXML deve essere in realtà un microdocumento XML, in quanto per essere accettato dalla classe l'input deve essere ben formato, ossia presentare un prologo XML e un elemento radice.

Per il resto il parsing del documento di destinazione non presenta alcun problema di sorta.

Torna su