134 votes

Meilleur moyen d'analyser les flux RSS / Atom avec PHP

J'utilise actuellement Magpie RSS, mais il tombe parfois lorsque le flux RSS ou Atom n'est pas bien formé. Existe-t-il d'autres options pour analyser les flux RSS et Atom avec PHP?

167voto

Brian Cline Points 8904

J'ai toujours utilisé le SimpleXML fonctions intégrées à PHP pour parser des documents XML. C'est l'un des rares générique des analyseurs de là-bas qui a une structure intuitive, ce qui rend extrêmement facile à construire un sens de classe pour faire quelque chose de spécifique comme un flux RSS. En outre, il permet de détecter XML des avertissements et des erreurs, et sur de le trouver, il vous suffit d'exécuter la source à travers quelque chose comme HTML Tidy (comme ceejayoz mentionné) à la nettoyer et essayer de nouveau.

Considère qu'il est très rugueuse, simple classe à l'aide de 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;
    }
}

41voto

PJunior Points 423

Avec 4 lignes, j'importe un rss dans un tableau.

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

Pour une solution plus complexe

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

29voto

Philip Morton Points 24913

Vos autres options incluent:

13voto

porneL Points 42805

Si le flux n'est pas du XML bien formé, vous êtes censé le rejeter, sans exception. Vous avez le droit d'appeler un créateur de flux un bozo .

Sinon, vous ouvrez la voie à la fin de HTML.

6voto

ceejayoz Points 85962

La bibliothèque HTML Tidy est capable de réparer certains fichiers XML mal formés. Exécuter vos flux à travers cela avant de les transmettre à l'analyseur peut vous aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X