it-swarm.com.de

Der beste Weg, um RSS / Atom-Feeds mit PHP

Ich verwende derzeit Magpie RSS , aber es kommt manchmal vor, dass der RSS- oder Atom) -Feed nicht korrekt formatiert ist. Gibt es andere Optionen zum Parsen von RSS und =? Atom Feeds mit PHP?

130
carson

Ihre anderen Optionen umfassen:

29
Philip Morton

Ich habe immer die in PHP integrierten SimpleXML-Funktionen verwendet, um XML-Dokumente zu analysieren. Es ist einer der wenigen generischen Parser, die eine intuitive Struktur haben, die es extrem einfach macht, eine aussagekräftige Klasse für etwas Bestimmtes wie einen RSS-Feed zu erstellen. Darüber hinaus werden XML-Warnungen und -Fehler erkannt, und wenn Sie einen gefunden haben, können Sie den Quellcode einfach über HTML Tidy (wie ceejayoz sagte) ausführen, um ihn zu bereinigen und erneut zu versuchen.

Betrachten Sie diese sehr raue, einfache Klasse mit 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 = $_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;
    }
}
164
Brian Cline

Mit 4 Zeilen importiere ich ein RSS in ein Array.

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

Für eine komplexere Lösung

$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);
38
PJunior

Ich möchte ein einfaches Skript zum Parsen von RSS vorstellen:

$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++;
}
17

Wenn der Feed kein wohlgeformtes XML ist, sollten Sie ihn ohne Ausnahmen ablehnen. Sie haben das Recht, den Feed-Ersteller einen Bozo anzurufen.

Andernfalls können Sie verhindern, dass HTML-Code verloren geht.

12
Kornel

Die HTML Tidy-Bibliothek kann einige fehlerhafte XML-Dateien reparieren. Das Durchlaufen Ihrer Feeds, bevor Sie sie an den Parser weiterleiten, kann hilfreich sein.

6
ceejayoz

Ich verwende SimplePie , um einen Google Reader-Feed zu analysieren. Er funktioniert ziemlich gut und verfügt über angemessene Funktionen.

Natürlich habe ich es nicht mit nicht wohlgeformten RSS/Atom) -Feeds getestet, daher weiß ich nicht, wie es damit umgeht. Ich gehe davon aus, dass die von Google ziemlich standardkonform sind! :)

2
user7094

Persönlich benutze ich BNC Advanced Feed Parser - ich mag das Template-System, das sehr einfach zu bedienen ist

1
Adam

Der PHP RSS-Reader - http://www.scriptol.com/rss/rss-reader.php - ist ein vollständiger, aber einfacher Parser, der von Tausenden von Benutzern verwendet wird ...

1
Thinol