<p> RSS,也叫做真正简单聚合(Really Simple Syndication)或者RDF站点摘要(RDF Site Summary),是一个让Web网站向用户发布和聚合最新内容的文件格式。RSS的“feed”用XML来表示;这样做的结果是,它能够被任何具备分析XML文件的客户端读取。现在这样的RSS客户端软件很多,用于Windows和Linux平台的都有,最新版本的Mozilla Firefox和Internet Explorer都允许你订阅所需要的RSS feed,以保证你的手头总有最新的信息。</p><p> 就像很多优秀的编程语言一样,PHP通过PEAR XML_RSS程序包对读取和创建RSS feed提供了支持。这个程序包是一个预先编译的代码库,它可以让你从RSS feed里提取信息,并把它们转换成另外一个格式(例如,MySQL数据库或者文本文件),或者如果你想要自定义创建一个能够从多个RSS源收集信息的Web页面。</p><p> 在本文里,我将讲解后面一种情况,告诉你如何使用PEAR XML_RSS包,把来自多个RSS feed的新闻标题集成到一个Web页面上。我现在假设你已经安装好了一个工作正常的Apache和PHP,而且你已经成功地下载和安装了PEAR XML_RSS程序包和依赖关系。</p><p> 开始吧</p><p> 现在就让我们从一个简单的例子开始,它将告诉你XML_RSS是如何工作的。首先创建下面的脚本(列表A):</p><p> 列表A</p><code><?php<br />// include class<br />include ("RSS.php");<br />// download and parse RSS data<br />$rss =& new XML_RSS("http://techrepublic.com.com/5150-22-0.xml");<br />$rss->parse();<br />// print headlines<br />print_r($rss->getItems());<br />?></code><p> 在这里,脚本会读取类定义,然后实例化一个新的XML_RSS()对象。对象的构造函数用来传递元数据的URL――这在本文里就是TechRepublic的RSS feed。然后,调用parse()方法来分析XML和从中提取信息。最后,getItems()方法会返回一个结构清晰的嵌套数组,也就是从feed中提取出来的新闻项目。每一个项目都有一个标题、一段描述、一个发表日期,以及链接到完整文章的URL ,就像下面显示的输出一样(列表B):</p>
<p> </p>
<p> 列表B</p><code>Array<br />(<br /> [0] => Array<br /> (<br /> [title] => Bump the size of your information store to 75GB (Exchange 2003 Standard Edition only)<br /> [link] => http://techrepublic.com.com/5100-1035_11-6063252.html?<br />part=rss&tag=feed&subj=tr<br /> [description] => In Service Pack 2, the Exchange developers<br />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<br />default. Here's how to change the size yourself.<br /> [pubdate] => Fri, 21 Apr 2006 00:00:00 PDT<br /> )<br /> [1] => Array<br /> (<br /> [title] => Learn the pros and cons of Windows Firewall<br /> [link] => http://techrepublic.com.com/5100-1009_11-6063367.html?<br />part=rss&tag=feed&subj=tr<br /> [description] => Is Windows Firewall up to the task of securing your network? Mike Mullins has<br />his doubts. In this edition of Security Solutions, he delves into the details of Windows Firewall and weighs its pros and cons.<br /> [pubdate] => Thu, 20 Apr 2006 13:25:00 PDT<br /> )<br />...<br />)</code><p> 提取关于feed本身的源信息也是可能的,把调用getItems()改成调用getChannelInfo()就可以了。正如其名字所表示的,这个方法用来返回与feed本身相关的信息,包括题目和描述(如果有的话)。下面就是它的代码(列表C):</p>
<p> </p>
<p> 列表C</p><code><?php<br />// include class<br />include ("RSS.php");<br />// download and parse RSS data<br />$rss =& new XML_RSS("http://techrepublic.com.com/5150-22-0.xml");<br />$rss->parse();<br />// print channel information<br />print_r($rss->getChannelInfo());<br />?></code><p> 下面是输出结果(列表D):</p><p> 列表D</p><code>Array<br />(<br /> [title] => TechRepublic.com<br /> [link] => http://www.techrepublic.com/<br /> [description] => Real World. Real Time.Real IT.<br />)</code><p> 使用单个feed</p><p> 正如前面的例子所显示的,XML_RSS在分析RSS feed和将其转换成PHP数组上做得相当好。一旦这个数组被生成,将其处理成为适合在Web网站上显示的格式就相当容易了。下面一个例子就说明了这一点(列表E):</p><p> 列表E</p><code><html><br /><head></head><br /><body><br />The latest from TechRepublic: <p /><br /><ul><br /><?php<br />// include class<br />include ("RSS.php");<br />// download and parse RSS data<br />$rss =& new XML_RSS("http://techrepublic.com.com/5150-22-0.xml");<br />$rss->parse();<br />// print channel information<br />foreach ($rss->getItems() as $item) {<br /> echo "<li><a href="" . $item['link'] . "">" . $item['title'] . "</a><br />";<br /> echo $item['description'] . " (" . $item['pubdate'] . ") <p />";<br />}<br />?><br /></ul><br /></body><br /></html></code><p> 在本文里,由getItems()返回的数组用foreach()循环来处理。数组的每一个元素本身就是一个数组,而其中的元素包括新闻标题、描述和发表日期。这些元素被提取出来,并被格式化成一个未排序HTML列表的元素。图A向你显示了这样一个例子:</p>
<p> </p>
<p> <img src="/content/uploadfile/200805/2008053117320401.gif" onclick="get_larger(this)" /></p><p> 数组元素</p><p> 使用多个feed</p><p> 一个feed怎么够呢?通过一个有点创意的代码你就可以随意添加feed了!列表F就是这样一段代码:</p><p> 列表F</p><code><html><br /><head></head><br /><body><br /><?php <br />// include class<br />include ("RSS.php");<br />// set up array of RSS feeds<br />$feeds = array( "http://techrepublic.com.com/5150-22-0.xml",<br /> "http://news.linux.com/news.rss",<br /> "http://rss.slashdot.org/Slashdot/slashdot");<br />// retrieve each feed<br />// get channel information and headlines<br />foreach ($feeds as $f) {<br /> $rss =& new XML_RSS($f);<br /> $rss->parse();<br /> $info = $rss->getChannelInfo();<br /> $items = $rss->getItems();<br /> <br /> // print channel information<br />?><br /> <b>The latest from <a href="<?php echo $info['link']; ?>"><?php echo $info['title']; ?></a></b>:<br /> <p /><br /> <ul><br /><?php<br /> // print headlines and descriptions<br /> foreach ($items as $item) {<br /> echo "<li><a href="" . $item['link'] . "">" . $item['title'] . "</a><br />";<br /> echo $item['description'] . "<p />";<br /> }<br />?><br /> </ul><br /> <p /><br /><?php<br />}<br />?><br /></body><br /></html></code><p> 对前面一个示例代码的修改既简单又清楚。我创建了一个含有指向不同feed的URL的数组,并用了一个循环来处理这个数组,而没有在对象构造函数里硬性地将URL和feed关联在一起。循环的每次反复都会创建一个新的、带有不同源feed的XML_RSS对象;这个feed然后按照正常的方式被处理,也就是调用parse()和getItems()方法。其他的改进是getChannelInfo()方法的使用,这在前面已经讨论过,它被用来在每个标题列表的顶部动态显示feed的名称和URL。</p></p><p> 下面就是输出结果的一个例子(图B):</p><p> <img src="/content/uploadfile/200805/2008053117320689.gif" onclick="get_larger(this)" /></p><p> 不止一个RSS feed</p><p> 当然,你可以修改这个结构以便更贴切地反映你的需要。例如,脚本会即时显示每个feed里的所有新闻标题;比如,你可以把它改为只显示每个feed的前5条标题,只需要使用for()循环并在第二个嵌套层里使用一个计数器就可以了。你还可以重新格式化页面布局,以便在下拉菜单里显示新闻标题,这样就能够进行一种不同类型的浏览。试一下身手吧,玩得高兴!</p></p>