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.bjsak.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。
不止一个RSS feed
当然,你可以修改这个结构以便更贴切地反映你的需要。例如,脚本会即时显示每个feed里的所有足浴粉新闻标题;比如,你可以把它改为只显示每个feed的前5条标题,只需要使用for()循环并在第二个嵌套层里使用一个计数器就可以了。你还可以重新格式化页面布局,以便在下拉菜单里显示新闻标题,这样就能够进行一种不同类型的浏览。