RSS / Atom ayrıştırmak için en iyi yolu, PHP ile beslemeleri

7 Cevap php

Şu anda Magpie RSS kullanıyorum ama RSS veya Atom besleme iyi biçimlendirilmiş değilken bazen düşer. RSS ayrıştırma ve Atom PHP ile beslemeleri için başka seçenekler var mı?

7 Cevap

Sizin diğer seçenekler şunlardır:

Ben her zaman the SimpleXML functions built in to PHP XML belgeleri ayrıştırmak için kullandım. Bir RSS beslemesi gibi özel bir şey için anlamlı bir sınıf oluşturmak için son derece kolay hale buna sezgisel bir yapıya sahiptir orada birkaç jenerik ayrıştırıcıların biri. Ayrıca, XML uyarıları ve hataları tespit edecek ve herhangi bir bulgu üzerine sadece HTML Tidy gibi bir şey aracılığıyla kaynağını çalıştırabilir (ceejayoz belirtildiği gibi) o kadar temiz ve tekrar deneyin.

SimpleXML kullanarak bu çok kaba, basit bir sınıf düşünün:

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;
    }
}

Feed iyi biçimlendirilmiş bir XML değilse, sen, hiçbir istisna reddetmek gerekiyordu. Sen yem yaratıcısı a bozo aramak için hak ediyorsun.

Aksi takdirde HTML içeri sona erdi karışıklık önünü konum

4 satır, bir dizi için bir rss ithal.

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

Daha karmaşık bir çözüm için

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

HTML Tidy kütüphanesi bazı bozuk XML dosyalarını düzeltmek mümkün değildir. Çözümleyici onları geçirmeden önce o aracılığıyla beslemeleri Koşu yardımcı olabilir.

Ben kullanmak SimplePie Google Reader besleme ayrıştırmak ve oldukça iyi çalışıyor ve iyi bir özellik seti vardır.

Tabii ki, ben bu yüzden bu ile baş nasıl bilmiyorum olmayan iyi oluşturulmuş RSS / Atom beslemelerini ile test etmedim, ben Google'ın uyumlu oldukça standartları vardır varsayarak yaşıyorum! :)

Şahsen ben kullanmak BNC İleri Besleme Ayrıştırıcı-i kullanmak çok kolaydır şablon sistemi gibi