【IT168 专稿】困难的选择
经过上次我给你的训练之后,你可能或者对建立另外一个PHP应用摩拳擦掌或者你已经决定放弃PHP编程而以尝试种植黄瓜来代替。如果是后者,那么你应该立即停止阅读,因为我可以向你保证PHP 101的结束部分绝对与教授你关于蔬菜耕作方面的内容没有一点关系。
然而,如果是前者,那么你将会享受接下来的内容。通过接下来的几页,我将会使用PHP、SQLite和SimpleXML来开发一个简单的RSS新闻聚合器。使用这种新闻聚合器,你可以从所有的Web页面中插入RSS新闻信源,从而为你的Web站点创建一个反映你的需求和兴趣的新闻广播。其中最好的部分是:每次你浏览它的时候,其采用最新的消息自动更新。
请跟着来,让我们开始吧!
字母汤
我将会从基础开始。RSS到底是什么呢?
RSS(该缩写词代表RDF站点摘要--RDF Site Summary)是一个最初由Netscape设计的格式,它用来分发关于Netscape的My.Netscape.Com门户上的内容的信息。该格式自其在1997年初期出现以来已经经过了许多反复(请访问http://backend.userland.com/stories/rss091以获取关于RSS的长期和复杂的历史方面的信息),但是大部分信源使用RSS 1.0或者RSS 0.91,这两个版本均是轻量级但具有全部特征。
RSS使得Web站点管理员在特定站点特定时间公布和分发新的和有趣的信息变得可能。该信息范围从新闻文章列表到股票市场数据或者天气预报,该信息以格式化良好的XML文档发布,而且因此它可以被任意XML解析器(包括为PHP 5的一部分的SimpleXML)解析、处理和呈现。
相当多的流行Web站点使得RSS或者RDF新闻信源普遍对公众可用。Freshmeat和Slashdot两个均有一个,而且许多其他站点也是这样包括PEAR、PECL和Zend站点。一个对于公众RSS信源的快捷的Google搜索将使你得到数不清的链接。
一个RSS文档通常情况下包含采用描述性元数据标注的资源列表(URLs)。请看下面的例子:
<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> <channel rdf:about="http://www.melonfire.com/"> <title>Trog</title> <description>Well-written technical articles and tutorials on web technologies</description> <link>http://www.melonfire.com/community/columns/trog/</link> <items> <rdf:Seq> <li rdf:resource="http://www.melonfire.com/community/columns/trog/article.php?id=100" /> <li rdf:resource="http://www.melonfire.com/community/columns/trog/article.php?id=71" /> <li rdf:resource="http://www.melonfire.com/community/columns/trog/article.php?id=62" /> </rdf:Seq> </items> </channel> <item rdf:about="http://www.melonfire.com/community/columns/trog/article.php?id=100"> <title>Building A PHP-Based Mail Client (part 1)</title> <link>http://www.melonfire.com/community/columns/trog/article.php?id=100</link> <description>Ever wondered how web-based mail clients work? Find out here.</description> </item> <item rdf:about="http://www.melonfire.com/community/columns/trog/article.php?id=71"> <title>Using PHP With XML (part 1)</title> <link>http://www.melonfire.com/community/columns/trog/article.php?id=71</link> <description>Use PHP's SAX parser to parse XML data and generate HTML pages.</description> </item> <item rdf:about="http://www.melonfire.com/community/columns/trog/article.php?id=62"> <title>Access Granted</title> <link>http://www.melonfire.com/community/columns/trog/article.php?id=62</link> <description>Precisely control access to information with the SQLite grant tables.</description> </item> </rdf:RDF>
正如你所见,一个RDF文件被划分为明显地以分割线划分的段落。第一部分以文档序言、命名空间声明以及根元素开始。第一部分后面紧跟着一个<channel>块,它包含了关于该RDF文件所描述的频道方面的概要信息。在上述例子中,这个频道是Melonfire's Trog专栏,它每周以新的技术文章和教程而更新。
<channel>块包含一个<items>块,该块包含了RDF文档内所描述的所有资源的顺序列表。该块内的每个资源对应于其后续的<item>块内详细描述的资源。每一个<item>块更加详细地描述了一单一资源,提供了该资源的题目、一个URL地址和描述。我们的应用程序将会用来产生个性化新闻信源的就是该信息。