PHP商城RSS订阅源类开发详解

一、RSS简介  
      RSS(ReallySimple Syndication-简易供稿),是一种网页内容联合格式(web contentsydication format)。RSS是XML的一种。所有的RSS文档都遵循XML 1.0规范,该规范发布在W3C网站上。
 
      在一个RSS文档的开头是一个<rss>节点和一个规定的属性version,该属性规定了该文档将以RSS的哪个版本表示。如果该文档以这个规范来表示,那么它的version属性就必须等于2.0。
      在<rss>节点的下一级是一个独立的<channel>节点,该节点包含关于channel的信息和内容。
      内容信息使用< item>节点表示,< item>的子节点有title、link、author、pubDate、description。 
 
        rss:每个RSSFeed,都有而且只能有一个rss标签,作为顶层元素
        channel:在RSS标签下,必须有且只能有一个channel标签
        item:可以出现多个item,每个item,描述一条日志信息
        title:日志的标题
        link:日志的URL访问地址
        author:日志的作者
        pubDate:日志的发布日期
        description:日志的内容 
注:具体的语法内容,可以参考 http://wenku.baidu.com/view/bcb222eeaeaad1f346933f64.html



二、RSS格式参考模板

 1 <?xml version="1.0" encoding="utf-8" ?> 
 2 
 3 <rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
 4 
 5         <channel>
 6 
 7                     <title>标题></title>
 8 
 9                     <link>链接地址</link>
10 
11                     <description>描述</description>
12 
13                     <language>描述语言</language>
14 
15                     <copyright>版本</copyright>
16 
17                     <pubDate>21 Oct 2008 01:43:15 GMT</pubDate>
18 
19                     < item>
20 
21                                 <title>日志的标题1</title>
22 
23                                 <link>日志的URL访问地址</link>
24 
25                                 <author>日志的作者</author>
26 
27                                 <pubDate>日志的发布日期</pubDate>
28 
29                                 <description>日志的内容</description>
30 
31                     </item>        
32 
33                     < item>
34 
35                                 <title>日志的标题2</title>
36 
37                                 <link>日志的URL访问地址</link>
38 
39                                 <author>日志的作者</author>
40 
41                                  <pubDate>日志的发布日期</pubDate>
42 
43                                 <description>日志的内容</description>
44 
45                     </item>
46 
47         </channel>
48 
49 </rss>

 

 三、RSS错误分析

        有时,我们的RSS代码写的是正确的,即单独运行时有用,可是一旦与PHP结合,便会报以下错误,这个问题困扰了我一个上午:
 技术分享
据我经验了解,由于我们编写代码的习惯,我们写PHP程序是,经常会使用稳妥的办法,使用echo xxx,来调试代码,这既是此处报错的原因,可能是因为RSS的代码前面不得有任何的输出(echo xxx);    
同时,php文件的<?php 前不得有空行或者输出内容
                                                    ------此处仅代表本人个人 根据经验总结的思想,还望前辈们不吝赐教

四、PHP商城 RS订阅源实战

(1)首先我们编写一个RS模板  template.xml,如下:

<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/"></rss>

技术分享


(2):编写好模板,我们就可以正式开发RS订阅源类了   feed_class.php,代码如下:

 
 

(3)好了,此时,我们完成了 RSS模板 和 RSS类的开发,开启Apache 服务器,在浏览器上运行我们的feed_class.php,结果图如下:
正常的结果如下: 
 
技术分享


在未安装RSS阅读器上,显示的是xml文件代码,结果去下:比如说GOOGLE的Chrome(解决的办法很简单,安装RSS阅读器插件即可)

技术分享

 1 <?php
 2  
 3 //连接数据库,动态生成RSS feed
 4 //连接数据库,取得最新的10条商品,输出XML feed
 5  
 6 class feed_class{
 7  
 8         public $title = ‘‘;                 //channel的title
 9         public $link  = ‘‘;                //channel的link
10         public $description = ‘‘;     //channel的description
11         public $itemlist = array();
12  
13         public $template = ‘‘;        //xml模板
14         protected $dom = null;
15         protected $rss = null;
16         protected $channel = null;
17  
18         public function __construct(){
19             $this->dom = new DomDocument("1.0","utf-8");
20             $this->dom->load(‘./template.xml‘);
21             $this->dom->formatOutput = true;
22             $this->rss = $this->dom->getElementsByTagName(‘rss‘)->item(0);
23         }
24  
25     //调用createItem,把所有的item节点生成,再输出
26         public function display(){
27             $this->createChannel();
28             $this->addItem($this->itemlist);
29             header(‘content-type: text/xml‘);
30             echo $this->dom->saveXML();
31             //$this->dom->save(‘01.xml‘);        //如需将代码保存,则打开此语句
32         }
33     
34         //封装createChannel方法,用于创建RSS唯一且必须的channel节点
35         protected function createChannel(){
36             $channel = $this->dom->createElement(‘channel‘);
37             $channel->appendChild($this->createEle(‘title‘,$this->title));
38             $channel->appendChild($this->createEle(‘link‘,$this->link));
39             $channel->appendChild($this->createEle(‘description‘,$this->description));
40             $this->channel = $channel;
41             $this->rss->appendChild($channel);
42         }
43  
44         //封装addItem方法,把所有的商品增加到RSS中去
45         //$list是商品列表,是二维数组,每一行都是一个商品
46         public function addItem($list){
47             foreach($list as $goods){
48                    $this->channel->appendChild($this->createItem($goods));
49             }
50         }
51  
52         //封装一个类用于造Item
53         protected function createItem($arr){
54             $item = $this->dom->createElement(‘item‘);
55             foreach($arr as $k=>$v){
56                 $item->appendChild($this->createEle($k,$v));
57             }
58             return $item;
59         }
60  
61         //快速创建节点  类似:<name>lover雪</name>
62         public function createEle($name,$value){
63             $ele = $this->dom->createElement($name);
64             $text = $this->dom->createTextNode($value);
65             $ele->appendChild($text);
66  
67             return $ele;
68         }   
69  
70     
71 }
72 //连接数据库
73 $conn = mysql_connect(‘localhost‘,‘root‘,‘‘);
74  
75  
76 mysql_query(‘set names utf8‘,$conn);
77 mysql_query(‘use boolshop1‘);
78 
79 
80  
81 $sql = "select goods_name as title,goods_brief as description from goods order by add_time asc limit 10";
82 $rs = mysql_query($sql,$conn);
83  
84  
85 $list = array();
86 while($row = mysql_fetch_assoc($rs)){
87     $list[] = $row;
88 }
89  
90 $feed1 = new feed_class();
91 $feed1->title = "布尔商城";
92 $feed1->link = "http://127.0.0.1/boolshop/";
93 $feed1->description = "这个一个好商城";
94 $feed1->itemlist = $list;
95  
96 $feed1->display();
97  
98 ?>

 


五、总结

    RSS 决不是一个完美的格式,但是它现在已经非常流行,并得到广泛的支持。要成为一个固定的规范,RSS需要很长的一段时间。
    编写RSS的xml文件时,由于浏览器的严格解析模式,一旦出现一点点错误,都不会显示任何效果,此时需要足够的耐心去找到错误,并且修正它,
    须特别注意,在RSS代码前不得有任何的文字或者其他信息输出,一旦把这点忘记了,你才会明白,这个错误查找起来是有多么痛苦(因为本人就是犯了这个错误,花了一个上午不断的在调试,过程很痛苦,因为代码根本就没错,也就是说根本就没法查错,有点类似感慨是接触编程时的逻辑错误,没法查)。





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。