Cara terbaik untuk mengurai RSS / Atom feed dengan PHP [closed]

135

Saat ini saya menggunakan Magpie RSS tetapi terkadang gagal saat RSS atau umpan Atom tidak dibentuk dengan baik. Apakah ada opsi lain untuk mengurai RSS dan Atom feed dengan PHP?

Carson
sumber
1
Ada satu masalah dengan permintaan ini, sebagian besar pembaca Feed menggunakan pembaca XML inti php dan jika XML tidak Berformat Baik seperti yang dipersyaratkan oleh standar XML, itu akan gagal, Anda dapat melihat yang tidak menggunakan pembaca XML dan menggunakan Pembaca Teks bagaimanapun beban di server akan meningkat secara dramatis. Saya tahu ini terjawab. Saya hanya membuat orang sadar akan kekurangan menggunakan pembaca umpan XML
Barkermn01
1
Jangan pernah mencoba mengurai XML yang tidak valid. Salahkan sumbernya.
Lothar

Jawaban:

28

Pilihan Anda yang lain termasuk:

Philip Morton
sumber
191
Saya tidak suka "jawaban" seperti itu, memberi link tanpa komentar. Sepertinya Anda mencarinya di Google dan menautkan ke beberapa hasil teratas. Terutama karena penanya memiliki pengalaman RSS dan membutuhkan parser yang lebih baik .
dualitas_
3
Jika seseorang membutuhkan sedikit saran, RSS Terakhir adalah yang termudah di antara tiga yang tercantum di atas. Hanya 1 file yang "membutuhkan", dan dapat mengambil RSS dalam 5 baris, dengan output array yang layak.
Raptor
picoFeed github.com/fguillot/picoFeed
gadelat
Saya telah menggunakan dua di antaranya dan LastRss tampaknya tidak cukup baik untuk menyediakan pembantu yang berfungsi penuh dan SimplePie agak terlalu rumit. Saya ingin mencoba beberapa yang lain tetapi komentar ke libs itu lebih baik untuk dipahami orang, bukan hanya tautan.
noob
171

Saya selalu menggunakan fungsi SimpleXML bawaan PHP untuk mengurai dokumen XML. Ini adalah salah satu dari sedikit parser generik di luar sana yang memiliki struktur intuitif, yang membuatnya sangat mudah untuk membangun kelas yang bermakna untuk sesuatu yang spesifik seperti umpan RSS. Selain itu, ini akan mendeteksi peringatan dan kesalahan XML, dan setelah menemukannya, Anda dapat menjalankan sumber melalui sesuatu seperti HTML Tidy (seperti yang disebutkan ceejayoz) untuk membersihkannya dan mencobanya lagi.

Pertimbangkan kelas yang sangat kasar dan sederhana ini menggunakan 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;
    }
}
Brian Cline
sumber
2
Anda memiliki tag akhir tanpa tag awal. ;)
Talvi Watia
131
Ya, saya punya satu, tetapi dimakan oleh pemformat kode SO karena tidak ada baris kosong di atasnya. Pada catatan terkait, Anda tidak memulai kalimat Anda dengan huruf kapital. ;)
Brian Cline
4
Harap ubah $feed_uri = $feed_or_url;ke $feed_uri = $file_or_url;... selain itu, terima kasih atas kode ini! Ini bekerja dengan baik!
Tim
5
Perhatikan bahwa meskipun solusi ini bagus, itu hanya akan mengurai RSS feed dalam bentuknya saat ini. Umpan atom tidak akan diurai karena skema yang berbeda.
András Szepesházi
9
Perhatikan bahwa eregi_replacesekarang tidak digunakan lagi dan telah diganti dengan preg_replaceserta eregidengan preg_match. Dokumentasi masing-masing dapat ditemukan di sini dan di sini .
ITS Alaska
45

Dengan 4 baris, saya mengimpor rss ke array.

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

Untuk solusi yang lebih kompleks

$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);
PJunior
sumber
2
Saya baru mencobanya. Itu tidak memberikan array
samayo
dapatkah kamu memberi saya rss feed yang kamu gunakan?
PJunior
2
Jika Anda bertanya-tanya. Sepertinya dia menggunakan umpan tumblr rss. Anytumblrsite.com/rss akan memberi Anda hasil yang sama.
andrewk
3
Menggunakan 4 baris, melakukan pekerjaan dengan baik :) tetapi kemudian saya menulis ulang baris pertama: $feed = file_get_contents('http://yourdomains.com/feed.rss'); mungkin kurang intensif daripada file + implode
Guidouil
1
satu baris, $ feed = json_decode (json_encode (simplexml_load_file (' news.google.com/?output=rss' )), true);
tanya_io
23

Saya ingin memperkenalkan skrip sederhana untuk mengurai 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++;
}
Vladimir Lukyanov
sumber
Solusi yang jelas dan sederhana! Bekerja dengan baik.
John T
daripada menggunakan $ xml = simplexml_load_string ($ feed), ini bekerja cukup sederhana, dalam mencetak datanya juga ...
Srinivas08
13

Jika feed bukan XML dengan format yang baik, Anda seharusnya menolaknya, tanpa pengecualian. Anda berhak menyebut pembuat feed sebagai bozo .

Jika tidak, Anda sedang membuka jalan untuk mengacaukan HTML itu.

Kornel
sumber
3
+1, Anda tidak boleh mencoba mengatasi XML apa pun yang bentuknya tidak baik. Kami punya pengalaman buruk dengan mereka, percayalah, itu sangat menyakitkan :(
Helen Neely
35
Namun, programmer tidak boleh memilih mitra bisnis dan harus mengurai apa yang diberikan kepada mereka.
Edmond Meinfelder
2
Bagaimana jika Anda membuat pembaca RSS / Atom feed universal? Jika ada file xml dengan format yang salah dapat "mengacaukan" HTML Anda, siapakah Bozo? ;) Bersikaplah liberal dalam apa yang Anda terima.
yPhil
6

Pustaka HTML Tidy dapat memperbaiki beberapa file XML yang rusak. Menjalankan feed Anda melalui itu sebelum meneruskannya ke parser dapat membantu.

ceejayoz
sumber
2

Saya menggunakan SimplePie untuk mengurai umpan Pustaka Google dan berfungsi dengan baik serta memiliki serangkaian fitur yang layak.

Tentu saja, saya belum mengujinya dengan umpan RSS / Atom yang tidak berformat baik jadi saya tidak tahu bagaimana cara mengatasinya, saya berasumsi bahwa Google cukup memenuhi standar! :)


sumber
1

Secara pribadi saya menggunakan BNC Advanced Feed Parser- saya menyukai sistem templatnya yang sangat mudah digunakan

Adam
sumber
-2

Pengurai gratis hebat lainnya - http://bncscripts.com/free-php-rss-parser/ Sangat ringan (hanya 3kb) dan mudah digunakan!

Lucas
sumber
tidak bisa mengatakan "hebat" menggunakan gzinflate dan base64_decode, biasanya dinonaktifkan untuk keamanan.
tanya_io
itu link mati untuk porpus pemasaran.
SEO Sagive