Hmmm ... nu har jeg lige testet, og der er en bug i simpleXML, som jeg ikke har taget højde for. Derfor bør du skrive linjen om, hvor JSON-strengen skabes. Jeg har prøvet at skrive en version for ComputerWorld's rss - med en anelse rå formatering:
<?php
$sUrl = '
http://www.computerworld.dk/rss/all';$sXml = file_get_contents($sUrl);
$oXml = simplexml_load_string($sXml);
$sJson = json_encode(new SimpleXMLElement($oXml->asXML(), LIBXML_NOCDATA));
$aData = json_decode($sJson,true);
/*
echo '<pre>';
var_dump($aData['channel']['item']);
echo '</pre>';
echo '<hr>';
*/
$arrItems = $aData['channel']['item'];
$aHTML = array();
foreach ($arrItems as $item) {
$aHTML[] = '<div>';
$aHTML[] = '<h4>'.$item['title'].'</h4>';
$aHTML[] = '<div>'.$item['description'].'</div>';
$aHTML[] = '<div style="font-size:0.8em">'.$item['author'].': <span style="color:#999">'.$item['pubDate'].'</span></div>';
$aHTML[] = '<p><a href="'.$item['link'].'" target="_blank">Link</a></p>';
$aHTML[] = '</div><hr>';
}
echo implode('', $aHTML);
?>
Dette vil dog smide en notice (hvis din PHP er sat fornuftigt op), når/hvis et felt ikke eksisterer. I skrivende studn mangler der et 'author' felt i et item - og det smider en notice :o|
Løsningen er at sikre sig ved hvert felt med
isset:
foreach ($arrItems as $item) {
$aHTML[] = '<div>';
if (isset($item['title'])) $aHTML[] = '<h4>'.$item['title'].'</h4>';
if (isset($item['description'])) $aHTML[] = '<div>'.$item['description'].'</div>';
if (isset($item['author']) && isset($item['pubDate'])) $aHTML[] = '<div style="font-size:0.8em">'.$item['author'].': <span style="color:#999">'.$item['pubDate'].'</span></div>';
if (isset($item['link'])) $aHTML[] = '<p><a href="'.$item['link'].'" target="_blank">Link</a></p>';
$aHTML[] = '</div><hr>';
}
Læg i øvrigt også mærke til, at jeg inde i løkken skriver til en 'array buffer', som udskrives én gang. Der er mere effektivt end at udskrive hver linje i løkken =)