程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 用PHP程序包創建自己的RSS客戶端

用PHP程序包創建自己的RSS客戶端

編輯:關於PHP編程

RSS,也叫做真正簡單聚合(Really Simple Syndication)或者RDF站點摘要(RDF Site Summary),是一個讓Web網站向用戶發布和聚合最新內容的文件格式。RSS的“feed”用XML來表示;這樣做的結果是,它能夠被任何具備分析XML文件的客戶端讀取。現在這樣的RSS客戶端軟件很多,用於Windows和Linux平台的都有,最新版本的Mozilla Firefox和Internet Explorer都允許你訂閱所需要的RSS feed,以保證你的手頭總有最新的信息。

就像很多優秀的編程語言一樣,PHP通過PEAR XML_RSS程序包對讀取和創建RSS feed提供了支持。這個程序包是一個預先編譯的代碼庫,它可以讓你從RSS feed裡提取信息,並把它們轉換成另外一個格式(例如,MySQL數據庫或者文本文件),或者如果你想要自定義創建一個能夠從多個RSS源收集信息的Web頁面。

在本文裡,我將講解後面一種情況,告訴你如何使用PEAR XML_RSS包,把來自多個RSS feed的新聞標題集成到一個Web頁面上。我現在假設你已經安裝好了一個工作正常的Apache和PHP,而且你已經成功地下載和安裝了PEAR XML_RSS程序包和依賴關系。


開始吧

現在就讓我們從一個簡單的例子開始,它將告訴你XML_RSS是如何工作的。首先創建下面的腳本(列表A):

列表A

<?php
// include class
include ("RSS.php");

// download and parse RSS data
$rss =& new XML_RSS("http://techrepublic.com.com/5150-22-0.xml");
$rss->parse();

// print headlines
print_r($rss->getItems());
?>

在這裡,腳本會讀取類定義,然後實例化一個新的XML_RSS()對象。對象的構造函數用來傳遞元數據的URL——這在本文裡就是TechRepublic的RSS feed。然後,調用parse()方法來分析XML和從中提取信息。最後,getItems()方法會返回一個結構清晰的嵌套數組,也就是從feed中提取出來的新聞項目。每一個項目都有一個標題、一段描述、一個發表日期,以及鏈接到完整文章的URL ,就像下面顯示的輸出一樣(列表B):

列表B

Array
(
    [0] => Array
        (
            [title] => Bump the size of your information store to 75GB (Exchange 2003 Standard Edition only)
            [link] => http://techrepublic.com.com/5100-1035_11-6063252.html?
part=rss&tag=feed&subj=tr
            [description] => In Service Pack 2, the Exchange developers
have provided you with the ability to size the information store to any size you like between 1 and 75 GB, and they chose 18GB as the
default. Here's how to change the size yourself.
            [pubdate] => Fri, 21 Apr 2006 00:00:00 PDT
        )

    [1] => Array
        (
            [title] => Learn the pros and cons of Windows Firewall
            [link] => http://techrepublic.com.com/5100-1009_11-6063367.html?
part=rss&tag=feed&subj=tr
            [description] => Is Windows Firewall up to the task of securing your network? Mike Mullins has
his doubts. In this edition of Security Solutions, he delves into the details of Windows Firewall and weighs its pros and cons.
            [pubdate] => Thu, 20 Apr 2006 13:25:00 PDT
        )

...
)

提取關於feed本身的源信息也是可能的,把調用getItems()改成調用getChannelInfo()就可以了。正如其名字所表示的,這個方法用來返回與feed本身相關的信息,包括題目和描述(如果有的話)。下面就是它的代碼(列表C):

列表C

<?php
// include class
include ("RSS.php");

// download and parse RSS data
$rss =& new XML_RSS("http://techrepublic.com.com/5150-22-0.xml");
$rss->parse();

// print channel information
print_r($rss->getChannelInfo());
?>

下面是輸出結果(列表D):

列表D

Array
(
    [title] => TechRepublic.com
    [link] => http://www.techrepublic.com/
    [description] => Real World. Real Time.Real IT.
)

使用單個feed

正如前面的例子所顯示的,XML_RSS在分析RSS feed和將其轉換成PHP數組上做得相當好。一旦這個數組被生成,將其處理成為適合在Web網站上顯示的格式就相當容易了。下面一個例子就說明了這一點(列表E):

列表E

<html>
<head></head>
<body>

The latest from TechRepublic: <p />
<ul>

<?php
// include class
include ("RSS.php");

// download and parse RSS data
$rss =& new XML_RSS("http://techrepublic.com.com/5150-22-0.xml");
$rss->parse();

// print channel information
foreach ($rss->getItems() as $item) {
    echo "<li><a href=\"" . $item['link'] . "\">" . $item['title'] . "</a><br />";
    echo $item['description'] . " (" . $item['pubdate'] . ") <p />";
}
?>

</ul>
</body>
</html>

在本文裡,由getItems()返回的數組用foreach()循環來處理。數組的每一個元素本身就是一個數組,而其中的元素包括新聞標題、描述和發表日期。這些元素被提取出來,並被格式化成一個未排序HTML列表的元素。圖A向你顯示了這樣一個例子:

數組元素

使用多個feed

一個feed怎麼夠呢?通過一個有點創意的代碼你就可以隨意添加feed了!列表F就是這樣一段代碼:

列表F

<html>
<head></head>
<body>

<?php             
// include class
include ("RSS.php");

// set up array of RSS feeds
$feeds = array( "http://techrepublic.com.com/5150-22-0.xml",
                "http://news.linux.com/news.rss",
                "http://rss.slashdot.org/Slashdot/slashdot");

// retrieve each feed
// get channel information and headlines
foreach ($feeds as $f) {
    $rss =& new XML_RSS($f);
    $rss->parse();
    $info = $rss->getChannelInfo();
    $items = $rss->getItems();
   
    // print channel information
?>
    <b>The latest from <a href="<?php echo $info['link']; ?>"><?php echo $info['title']; ?></a></b>:
    <p />
    <ul>

<?php
    // print headlines and descriptions
    foreach ($items as $item) {
        echo "<li><a href=\"" . $item['link'] . "\">" . $item['title'] . "</a><br />";
        echo $item['description'] . "<p />";
    }
?>

    </ul>
    <p />

<?php
}
?>

</body>
</html>

對前面一個示例代碼的修改既簡單又清楚。我創建了一個含有指向不同feed的URL的數組,並用了一個循環來處理這個數組,而沒有在對象構造函數裡硬性地將URL和feed關聯在一起。循環的每次反復都會創建一個新的、帶有不同源feed的XML_RSS對象;這個feed然後按照正常的方式被處理,也就是調用parse()和getItems()方法。其他的改進是getChannelInfo()方法的使用,這在前面已經討論過,它被用來在每個標題列表的頂部動態顯示feed的名稱和URL。

下面就是輸出結果的一個例子(圖B):

不止一個RSS feed
 


當然,你可以修改這個結構以便更貼切地反映你的需要。例如,腳本會即時顯示每個feed裡的所有新聞標題;比如,你可以把它改為只顯示每個feed的前5條標題,只需要使用for()循環並在第二個嵌套層裡使用一個計數器就可以了。你還可以重新格式化頁面布局,以便在下拉菜單裡顯示新聞標題,這樣就能夠進行一種不同類型的浏覽。試一下身手吧,玩得高興!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved