制作RSS供应源

在玩博客的时候,有这样的一个功能,就是RSS订阅,今天我也实现一个制作RSS供应源的功能。点击RSS订阅按钮,可以看到如下的内容。

这里写图片描述

其实,这个功能不是很难。只要按照RSS的规范来,无非也就是写一个特殊的XML文件,如何特殊了?因为我们要按照它的规范来定义节点的名称。

特殊点:
(1)有且仅有一个rss节点标签
(2)有且仅有一个channel节点标签,channel标签中必须有一下子节点:title、link、description
(3)可以有多个Item标签,item标签中必须有一下子节点:title、description
请参考阅读rss2.0规范。

1、一个简单的RSS订阅源内容

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <!--一个RSS阅读源-->
    <channel>
        <title>我的商城</title>
        <link>http://www.webbc.win</link>
        <description>我自己做的商城</description>
        <item>
            <title>三星Note 7</title>
            <description>曲屏,牛逼</description>
        </item>
        <item>
            <title>IPhone 7</title>
            <description>凶!</description>
        </item>
    </channel>
</rss>

用浏览器打开此文件,会看到如下效果。
这里写图片描述

我这里是直接把XML文件中的内容给写死了,CSDN博客肯定不是这样的,因为它的内容是动态的,是需要从数据库中读取的,这个操作想必对于每个php程序员都是最基本的技能,下面我实现一个从数据库中读取来制作一个动态内容的RSS供应源。

2、从数据库中读取内容制作RSS供应源

代码:

<?php
/**
 * 从数据库中读取信息,制作出RSS供应源
 * @author webbc
 */
class RSS {
    public $title = '';//channel的title
    public $link = '';//channel的link
    public $description = '';//channel的description
    public $dom = null;//dom节点对象
    public $rss = null;//rss节点对象
    public $list = array();//item的数组信息
    public $template = './rss_template.xml';//rss制作的模板文件

    //构造方法
    public function __construct(){
        $this->dom = new DOMDocument('1.0','utf-8');//创建dom对象
        $this->dom->load($this->template);//加载模板文件内容
        $this->rss = $this->dom->getElementsByTagName('rss')->item(0);//找到rss节点内容
    }

    //在浏览器上显示rss源内容
    public function display(){
        $this->createChannel();//创建channel信息
        $this->rss->appendChild($this->createChannel());//把channel节点信息添加到rss节点上
        //循环遍历List数组中的内容,将多个item节点信息绑定到rss节点上
        foreach ($this->list as $k => $v) {   
            $this->rss->appendChild($this->createItem($v));
        }
        //输出到浏览器:
        header('content-type:text/xml;charset=utf-8');
        echo $this->dom->saveXML();
    }

    //创建channel
    private function createChannel(){
        $channel = $this->dom->createElement('channel');
        $channel->appendChild($this->createEle('title',$this->title));
        $channel->appendChild($this->createEle('link',$this->link));
        $channel->appendChild($this->createEle('description',$this->description));
        return $channel;
    }

    //创建channel的item条目
    private function createItem($arr){
        $item = $this->dom->createElement('item');
        foreach ($arr as $k => $v) {
            $item->appendChild($this->createEle($k,$v));
        }
        return $item;
    }

    //创建一个节点,内容如下,<ele>some text</ele>
    private function createEle($name,$value){
        $text = $this->dom->createTextNode($value);
        $ele = $this->dom->createElement($name);
        $ele->appendChild($text);
        return $ele;
    }

}

//创建rss类对象,然后设置channel的tilte、link、description信息
$rss = new RSS();
$rss->title = '我的商城,我做主!';
$rss->link = 'http://wwww.webbc.win';
$rss->description = '有很多的优惠信息,不要错误哈';

//读取数据库
$conn = mysql_connect('localhost','root','1234');
mysql_query('use shop');
mysql_query('set names utf8');
$sql = 'select goods_name as title,shop_price as description from goods';//这里我将货物的名称作为title,货物的价格作为描述信息
$res = mysql_query($sql);
$list = array();
while($row = mysql_fetch_assoc($res)){
    $list[] = $row;
}
$rss->list = $list;


$rss->display();//显示XML显示
?>

RSS供应源的模板文件内容(rss_template.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!--RSS源制作的模板-->
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/"></rss>

数据库表内容:
这里写图片描述

运行结果图:
这里写图片描述

思路:
首先是写了一个RSS的类。然后创建这个类的对象,设置channel的tiltle、link、description的的信息,接着读取数据库,从中取得二维数组,注意,这个二维数组将作为item标签的内容,最后调用display方法将显示到浏览器上。display方法调用了createChannel方法创建channel信息的方法、并将channel节点信息添加到rss节点上,然后循环调用createItem方法添加了多个item节点信息。createChannel方法和createItem方法都使用了createEle方法。

思考:
这里写图片描述
当我们点击了csdn博客中的这个rss订阅按钮,实际上服务器进行了哪些操作?其实,简单点说,不就是和我们上面的操作是一样的吗?都是从数据库中读取信息,然后拼接成特殊的xml文件,然后输出到用户浏览器中。只不过是人家的数据库操作比我的复杂点,原理其实一样。希望能帮到大家!

原文地址:https://www.cnblogs.com/cnsec/p/13407070.html