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

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站点之中。

时间: 2024-11-08 22:13:11

如何用PHP把RDF内容插入Web站点之中(一)的相关文章

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  <lirdf:resource="http://www.melonfire.com/community/columns/trog/article.php?id=71" /><lirdf:resource="http://www.melonfire.com/community

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

web|插入|站点 筑巢时间(Nesting Time) 前面的例子只是用来说明问题的.如果你真想把RDF内容插入到Web站点当中,就需要把事情做的更好一些.所以把前面的脚本的作了改进,新增了一些东西,从而简化格式化RDF数据的任务. <html><head><basefont face="Verdana"></head><body> <table border="0" cellspacing=&qu

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  }} // destroy parserxml_parser_free($xp), // opening tag handlerfunction elementBegin($parser, $name, $attributes){global $currentTag, $flag,// export the name o

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

web|插入|站点 免费午餐(A Free Lunch) 上面我所写的那个类也是很基本的,是拿来说明问题的,或许也可以用于低访问量的站点.如果你想寻找一些更专业的东西,去网上吧,那里有许多的开放源码的RDF分析器,他们带有各种附加的功能(包括缓存). 那么就让我们看一些如何运用这些分析器的例子吧. 第一个要讲的是由Stefan Saasen 为fase4网站开发的RDF分析器类,可以从http://www.fase4.com/rdf/上免费下载.这是一个功能非常齐全的RDF分析器,支持缓存和通过

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

web|插入|站点 返回到类(Back To Class) 既然你有这么大的权力,那么究竟为什么要把自己限制在仅仅是单个的RDF来源呢?就象我早先说过的一样,大多数主要的站点都经常为他们所提供的内容做快照.其实将所有这些不同的来源插入到你的站点当中是相当简单的.让我们看看是如何做的. 首先,我们把前面例子中的代码模块化.这样一来,你就无须为每一个单个的来源都一遍又一遍的重写相同的代码了.简化的方法就是将之打包成类,再把这个类包含到我的PHP脚本当中. 类代码如下: <?class RDFPars

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

web|插入|站点 既然从技术上讲,RSS是结构良好的XML文档,所以可以用标准的XML编程技术来处理它.主要有两种技术:SAX(the Simple API for XML)和DOM(the Document Object Model). SAX分析器工作时遍历整个XML文档,在遇到不用类型的标记时调用特定的函数.比如,调用特定函数处理一个开始标记,调用另一个函数处理一个结束标记,再调用一个函数处理两者之间的数据.分析器的职责仅仅是顺序遍历这个文档.而它所调用的函数负责处理发现的标记.一旦一个

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  echo "<li><a href=" . $item["link"] . ">" .$item["title"] . "</a>",}}?></ul> 每次你重新装入

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  if (!($fp = fopen($this->file, "r"))) {die("Could not read $this->file"),} // parse datawhile ($xml = fread($fp, 4096)) {if (!xml_parse

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  // this is an array of arrays, with each array element representing an<item> // each outer array element is itself an associative array // with keys ("