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?


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:



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


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

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

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

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.


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.


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! :)


1

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



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.