当前位置:Linux教程 - Php - 如何用PHP把RDF内容插入Web站点之中(一)

如何用PHP把RDF内容插入Web站点之中(一)

名誉和巨大的财富

设想一个从最热门的门户网站获得最新的新闻的站点。股票价格,天气信息,新闻故事,线式讨论组,软件发布……所有这一切都将被动态更新,每小时一次,不需要任何手工干预。我们可以想象这随之而来的站点访问量,源源不断的广告收入以及网管大人所受到的“阿谀奉承”。

 但是现在,停止幻想,开始阅读,因为只要你密切关注此项技术,说不定你就能成为站点的主人。 对你的要求也只是稍许的想象力,一些聪明的PHP编码和几个免费的RSS文件。另外,很明显还包括这篇文章剩下的九个部分。

 

有内容,就联合成辛迪加(Have Content, Will Syndicate)
我们从最基本的开始——那么RSS究竟是什么鬼东西呢?

RSS(即RDF Site Summary)是一种格式,最早由Netscape公司设计,用于分发其门户站点My.Netscape.Com上的内容的描述信息。自1997年被提出以来,几经沉浮——可以点击文章末尾的链接,了解一下RSS悠久复杂的历史。现在的稳定的版本是RSS1.0,符合RDF规范。这一版本可以说即轻便又功能齐全。

RSS使得网管及时公布和分发某一特定站点的特定位置的最新最有趣的内容的描述信息变的可能。 从新闻文章列表到股票市场数据或着是天气预报,所有这些信息都可以通过结构良好的XML文档来发布,从而也可以被任何XML分析器进行分析,处理和翻译。

网站上最新信息的列表是经常更新的,而RSS使得这一列表的分发成为可能,也就为Web上简易的内容辛迪加联合打开了大门。想了解这其中的道理,请看下面这个简单的例子:

站点A,属新闻站点(“内容辛迪加组织者”),能够每小时发布一个包含最新新闻列表以及相应链接的RSS文档。 而这一RSS文档可以被其它站点获取(如站点B,“内容收集者”),分析并显示在站点B的索引页面上。 每次站点A发布一个新的RSS文档,站点B的索引页面都可以自动更新,以获取最新的新闻。

这种方案对交易中的双方机构都有效。 既然RSS文档中的链接都指向站点A上相应的文章,那么站点A将迅速体验到访问量的增加。 而站点B的网管可以休假一个星期,因为他有办法自动更新其站点上的索引页面,而这一方法仅仅是把索引页面与站点A发布的动态内容相连接而已。

有许多受欢迎的站点向公众提供详细的RSS或RDF新闻,如Freshmeat(http://www.freshmeat.net)和Slashdot(http://www.slashdot.org),当然还有其它许多站点。在这篇文章当中,我将广泛的使用Freshmeat网站的RDF文件。需要说明的一点是,这里所谈到的技术也可以应用于其它任何RSS1.0或RDF文件。

 

交换频道(Switching Channels)

典型的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.ph
p?id
=100\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=71\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=62\" />
                   </rdf:Seq>
           </items>
  </channel>
 
  <item
rdf:about=\"http://www.melonfire.com/community/columns/trog/article.php?i
d=10
0\">
           <title>Building A PHP-Based Mail Client (part 1)</title>
 
<link>http://www.melonfire.com/community/columns/trog/article.php?id=100
</li
nk>
           <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?i
d=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?i
d=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 mySQL grant tables.</description>
  </item>
 
你可以看到,RDF文件由几个界限分明的部分组成。首先是文档序码(prolog),

<?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所要描述的频道的一般信息。在上面的例子中,频道是Melonfire网站的Trog专栏,专栏内容是新的技术文章和指南,每星期更新一次。

<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.ph
p?id
=100\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=71\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=62\" />
                   </rdf:Seq>
           </items>
     </channel>

<channel>区包含了一个<items>区块,<items>区块又包含了文档中描述的所有资源的一个顺序列表。该列表通过一系列的<li />元素来表示。区块中每一个资源都在后面的<item>区块中有更详细的描述。

 <items>
                   <rdf:Seq>
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=100\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=71\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=62\" />
                   </rdf:Seq>
              </items>

  还可以在其中放置一个<image>区块,这样你就可以发布频道标志的URL。

  所以为了肉,RSS1.0文档中的每一个<item>区块都更详细地描述一个单独的资源,包括标题,URL和资源描述。

   <items>
                   <rdf:Seq>
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=100\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=71\" />
                            <li
rdf:resource=\"http://www.melonfire.com/community/columns/trog/article.ph
p?id
=62\" />
                   </rdf:Seq>
              </items>

在这个例子里,<item>区块描述了Ttrog“频道”中单独的一篇文章,并为这篇文章提供了描述和标题,以及URL。内容收集者可以利用URL创建“向后”链接。

 

你看得到,RSS1.0文件相当地直观明了,不管是手工,还是通过编程,都非常容易创建。上面的例子和解释仅仅是说明性质的,通常,你可以用RSS1.0和RDF做更多的事情。你最好看一下文章末尾提供的链接,以获取更多的信息。不过在这之前,我们再花几分钟讨论一如何将RSS1.0文档插入到你自己的Web站点之中。