Domanda

Attualmente sto utilizzando Magpie RSS ma a volte cade quando il feed RSS o Atom non lo è ben formato. Esistono altre opzioni per l'analisi dei feed RSS e Atom con PHP?

È stato utile?

Soluzione

Altri suggerimenti

Ho sempre usato le funzioni SimpleXML integrate in PHP per analizzare documenti XML. È uno dei pochi parser generici là fuori che ha una struttura intuitiva, il che rende estremamente facile costruire una classe significativa per qualcosa di specifico come un feed RSS. Inoltre, rileverà avvisi ed errori XML e, trovandone uno, potresti semplicemente eseguire il sorgente attraverso qualcosa come HTML Tidy (come ceejayoz citato) per ripulirlo e riprovare.

Considera questa classe molto approssimativa e semplice usando SimpleXML:

class BlogPost
{
    var $date;
    var $ts;
    var $link;

    var $title;
    var $text;
}

class BlogFeed
{
    var $posts = array();

    function __construct($file_or_url)
    {
        $file_or_url = $this->resolveFile($file_or_url);
        if (!($x = simplexml_load_file($file_or_url)))
            return;

        foreach ($x->channel->item as $item)
        {
            $post = new BlogPost();
            $post->date  = (string) $item->pubDate;
            $post->ts    = strtotime($item->pubDate);
            $post->link  = (string) $item->link;
            $post->title = (string) $item->title;
            $post->text  = (string) $item->description;

            // Create summary as a shortened body and remove images, 
            // extraneous line breaks, etc.
            $post->summary = $this->summarizeText($post->text);

            $this->posts[] = $post;
        }
    }

    private function resolveFile($file_or_url) {
        if (!preg_match('|^https?:|', $file_or_url))
            $feed_uri = 

Ho sempre usato le funzioni SimpleXML integrate in PHP per analizzare documenti XML. È uno dei pochi parser generici là fuori che ha una struttura intuitiva, il che rende estremamente facile costruire una classe significativa per qualcosa di specifico come un feed RSS. Inoltre, rileverà avvisi ed errori XML e, trovandone uno, potresti semplicemente eseguire il sorgente attraverso qualcosa come HTML Tidy (come ceejayoz citato) per ripulirlo e riprovare.

Considera questa classe molto approssimativa e semplice usando SimpleXML:

<*>SERVER['DOCUMENT_ROOT'] .'/shared/xml/'. $file_or_url; else $feed_uri = $file_or_url; return $feed_uri; } private function summarizeText($summary) { $summary = strip_tags($summary); // Truncate summary line to 100 characters $max_len = 100; if (strlen($summary) > $max_len) $summary = substr($summary, 0, $max_len) . '...'; return $summary; } }

Con 4 righe, importare un rss in un array.

$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Per una soluzione più complessa

$feed = new DOMDocument();
 $feed->load('file.rss');
 $json = array();
 $json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue;
 $items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

 $json['item'] = array();
 $i = 0;

 foreach($items as $key => $item) {
 $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
 $guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue;

 $json['item'][$key]['title'] = $title;
 $json['item'][$key]['description'] = $description;
 $json['item'][$key]['pubdate'] = $pubDate;
 $json['item'][$key]['guid'] = $guid; 
 }

echo json_encode($json);

Vorrei introdurre un semplice script per analizzare RSS:

$i = 0; // counter
$url = "http://www.banki.ru/xml/news.rss"; // url to parse
$rss = simplexml_load_file($url); // XML parser

// RSS items loop

print '<h2><img style="vertical-align: middle;" src="'.$rss->channel->image->url.'" /> '.$rss->channel->title.'</h2>'; // channel title + img with src

foreach($rss->channel->item as $item) {
if ($i < 10) { // parse only 10 items
    print '<a href="'.$item->link.'">'.$item->title.'</a><br />';
}

$i++;
}

Se il feed non è un XML ben formato, dovresti rifiutarlo, senza eccezioni. Hai il diritto di chiamare un creatore di feed un bozo .

Altrimenti stai aprendo la strada al caos in cui è finito l'HTML.

La libreria HTML Tidy è in grado di riparare alcuni file XML non validi. L'esecuzione dei feed prima di passarli al parser può essere utile.

Uso SimplePie per analizzare un feed di Google Reader e funziona abbastanza bene e ha un set di funzionalità decente.

Certo, non l'ho testato con feed RSS / Atom non ben formati, quindi non so come gestirli, suppongo che quelli di Google siano abbastanza conformi agli standard! :)

Personalmente uso BNC Advanced Feed Parser- mi piace il sistema di template che è molto facile da usare

Il lettore RSS di PHP - http://www.scriptol.com/rss/rss -reader.php - è un parser completo ma semplice usato da migliaia di utenti ...

Un altro ottimo parser gratuito - http://bncscripts.com/free-php-rss- parser / È molto leggero (solo 3kb) e semplice da usare!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top