如何用PHP把RDF内容插入Web站点之中(四)-经典文章-PHP教程-幽默笑话

如何用PHP把RDF内容插入Web站点之中(四)-经典文章-PHP教程-幽默笑话

文章内容如何用PHP把RDF内容插入Web站点之中(四)修改时间:[2010/01/2316:23]阅读次数:[547]发表者:[起缘]返回到类(BackToClass)既然你有这么大的权力,那么究竟为什么要把自己限制在仅仅是单个的RDF来源呢?就象我早先说过的一样,大多数主要的站点都经常为他们所提供的内容做快照。 其实将所有这些不同的来源插入到你的站点当中是相当简单的。

让我们看看是如何做的。 首先,我们把前面例子中的代码模块化。

这样一来,你就无须为每一个单个的来源都一遍又一遍的重写相同的代码了。

简化的方法就是将之打包成类,再把这个类包含到我的PHP脚本当中。 类代码如下:classRDFParser{////variables////setuplocalvariablesforthisclassvar$currentTag="";var$flag="";var$count=0;//thisisanassociativearrayofchanneldatawithkeys("title","link","description")var$channel=array();//thisisanarrayofarrays,witheacharrayelementrepresentinganitem//eachouterarrayelementisitselfanassociativearray//withkeys("title","link","description")var$items=array();////methods////setthenameoftheRDFfiletoparse//thisisusuallyalocalfile//youmaysetittoaremotefileifyourPHPbuildsupportsURLfopen()functionsetResource($file){$this-file=$file;}//parsetheRDFfilesetwithsetResource()//thispopulatesthe$channeland$itemsarraysfunctionparseResource(){//createparser$this-xp=xml_parser_create();//setobjectreferencexml_set_object($this-xp,$this);//sethandlersandparseroptionsxml_set_element_handler($this-xp,"elementBegin","elementEnd");xml_set_character_data_handler($this-xp,"characterData");xml_parser_set_option($this-xp,XML_OPTION_CASE_FOLDING,TRUE);xml_parser_set_option($this-xp,XML_OPTION_SKIP_WHITE,TRUE);//readXMLfileif(!($fp=fopen($this-file,"r"))){die("Couldnotread$this-file");}//parsedatawhile($xml=fread($fp,4096)){if(!xml_parse($this-xp,$xml,feof($fp))){die("XMLparsererror:".xml_error_string(xml_get_error_code($this-xp)));}}//destroyparserxml_parser_free($this-xp);}//openingtaghandlerfunctionelementBegin($parser,$name,$attributes){$this-currentTag=$name;//setflagifenteringchanneloritemblockif($name=="ITEM"){$this-flag=1;}elseif($name=="CHANNEL"){$this-flag=2;}}//closingtaghandlerfunctionelementEnd($parser,$name){$this-currentTag="";//setflagifexitingchanneloritemblockif($name=="ITEM"){$this-count++;$this-flag=0;}elseif($name=="CHANNEL"){$this-flag=0;}}//characterdatahandlerfunctioncharacterData($parser,$data){$data=trim(htmlspecialchars($data));if($this-currentTag=="TITLE"||$this-currentTag=="LINK"||$this-currentTag=="DESCRIPTION"){//adddatato$channels[]or$items[]arrayif($this-flag==1){$this-items[$this-count][strtolower($this-currentTag)].=$data;}elseif($this-flag==2){$this-channel[strtolower($this-currentTag)].=$data;}}}//returnanassociativearraycontainingchannelinformation//(the$channel[]array)functiongetChannelInfo(){return$this-channel;}//returnanassociativearrayofarrayscontainingiteminformation//(the$items[]array)functiongetItems(){return$this-items;}}如果你对PHP类较为熟悉的话,那么理解这段代码是相当容易的。 如果不太懂的话,那么请直接跳到文章末尾的链接部分,看一篇关于类工作原理的好文章。 然后在回来继续阅读上面的代码。

在使用这个类之前,我要特别花几分钟指出其中的一行代码——即上面对xml_set_object()函数调用的那一行。

现在的问题是如何使用这个类实际生成具有多个内容来源的Web页。 include("");//howmanyitemstodisplayineachchannel$maxItems=5;htmlheadbasefontface="Verdana"bodytablewidth="100%"border="0"cellspacing="5"cellpadding="5"tr!--firstcell--tdvalign=topalign=leftfontsize="-1"//$f=newRDFParser();$f-setResource("");$f-parseResource();$f_channel=$f-getChannelInfo();$f_items=$f-getItems();//nowformatandprintit...Thelatestfromahref=echo$f_channel["link"];echo$f_channel["title"];/abrul//iteratethroughitemsarrayfor($x=0;$x$maxItems;$x++){if(is_array($f_items[$x])){//printdata$item=$f_items[$x];echo"liahref=".$item["link"]."".$item["title"]."/a}}/ul/font/td!--secondcell--tdalign=centerwidth=50%iPrimarypagecontenthere/i/td!--thirdcell--tdvalign=topalign=leftfontsize="-1"//$s=newRDFParser();$s-setResource("");$s-parseResource();$s_channel=$s-getChannelInfo();$s_items=$s-getItems();//nowformatandprintit...Thelatestfromahref=echo$s_channel["link"];echo$s_channel["title"];/abrul//iteratethroughitemsarrayfor($x=0;$x$maxItems;$x++){if(is_array($s_items[$x])){//printdata$item=$s_items[$x];echo"liahref=".$item["link"]."".$item["title"]."/a}}/ul/font/td/tr/table/body/head/html这段代码相当简单。

一旦你用“new”关键字生成一个类的实例,$f=newRDFParser();那么就可以用类方法来设置要分析的RDF文件的位置,$f-setResource("");$f-parseResource();并且获取$channel和$items数组,以用于后面的处理。

$f_channel=$f-getChannelInfo();$f_items=$f-getItems();Thelatestfromahref=echo$f_channel["link"];echo$f_channel["title"];/abrul//iteratethroughitemsarrayfor($x=0;$x$maxItems;$x++){if(is_array($f_items[$x])){//printdata$item=$f_items[$x];echo"liahref=".$item["link"]."".$item["title"]."/a}}/ul每次你重新装入上面的脚本,相应的RDF文件就会被从特定的位置上取来,经过分析之后,按要求的格式显示出来。

如果你站点具有高的访问量,你就可能觉得我们的辛苦无意义之极,尤其是当所用的RDF数据更新地没有那么快时,情况更糟。 在这种情况下,或许探究一下在本地缓存RDF数据才是较明智的做法:要么扩展上面的例子程序,在其中加入缓存功能;要么每阁几个小时都花很长的时间下载一个最新RDF文件的本地副本到你的Web服务器上,然后使用这个本地副本,而不是那个“活”的(the“live”one)。

<#longshao:sxy_article#>

你还会喜欢:

{主关键词}
方盛云采科普折光仪有哪些?(转载)

{主关键词}
2019华中师范大学成人高等教育招生简章

{主关键词}
于云华教授主持山东省高校电工学会第十七届学术年会

{主关键词}
鹦鹉和藏獒的故事,很有深度!

{主关键词}
七星元宝龙龟有哪些风水作用

{主关键词}
iphone4翻新机换手机壳充新机 温州iphone4水货山寨手机市场暗访

{主关键词}
第七十九章:平叛战斗漫威世界的御主最新章节

{主关键词}
菲林自夸文:樊笼一小步

{主关键词}
21日全国主要城市冷轧板卷价格汇总

{主关键词}
河内古街,生活变迁“活化石”(第一现场)

{主关键词}
100个容易读错的中国地名,爱好旅游的同志请记牢,否则出行尴尬

{主关键词}
卫冕冬奥滑冰冠军后 羽生结弦开始挑战最高难度“四周半跳”