RSS 2.0 php生成类,快读生成需要xml文件

时间:2022-07-01 13:24:07

在项目中用到的RSS 2.0版本的php生成类。

只需要根据数据结构吧数据输入进去就能生成一个xml文件,并通过函数输出。


/**
* Rss生成模块
* @author JerryLi (@lijian@dzs.mobi)
* @see 协议说明 RSS规范遵循 2.0
* http://jyjsjd.iteye.com/blog/1543483
* http://rayleeya.iteye.com/blog/372802
*/
final class CRssBuilder{
/**
* 本地字符集
* @var string
*/
const LOCAL_CHARSET = 'gbk';
/**
* 语言
* @var string
*/
const LANGUAGE = 'zh-cn';
/**
* RSS所有者
* @var string
*/
const GENERATOR = 'www.csdn.net';
/**
* 板块通道
* @var array
*/
private $_aChannel = null;
/**
* 构造函数
* @param string $aChannel 频道属性
* <li>array('title'=>'频道标题', 'description'=>'频道摘要', 'link'=>'本频道URL地址')</li>
*/
public function __construct($aChannel){
header('Content-Type:text/xml; charset=UTF-8'); //必须输出标准的xml头
$this->_aChannel = array('channel'=>$aChannel, 'items'=>array());
}
/**
* 析构函数
*/
public function __destruct(){
}
/**
* 在通道内添加子项目
* @param int $iChannelId 通道ID(即:addChannel())
* <li>array('title'=>'标题','link'=>'文章的URL地址', 'description'=>'文章摘要','category'=>'栏目名称','utc_timestemp'=>'发布时间')</li>
* @return int item的数量
*/
public function addItems($aParam){
$this->_aChannel['items'][] = $aParam;
return count($this->_aChannel['items']);
}
/**
* 将内容序列化成rss的xml结构数据字符串
* @return string | null
*/
public function getSerialize(){
static $sTemplateChannel = null;
static $sTemplateItem = null;
if (empty($sTemplateChannel) || empty($sTemplateItem)){
$aTmp = array();
$aTmp[] = ' <channel>';
$aTmp[] = ' <language>'. self::LANGUAGE .'</language>';
$aTmp[] = ' <generator>'. self::GENERATOR .'</generator>';
$aTmp[] = ' <ttl>'. (60 * 24) .'</ttl>'; //更新时间为24小时
$aTmp[] = ' <pubDate>'. gmdate("D, d M Y 23:59:59", time()) .' GMT</pubDate>'; //当前RSS最后发布的时间
$aTmp[] = ' <title><![CDATA[{@channel_title}]]></title>';
$aTmp[] = ' <link><![CDATA[{@channel_link}]]></link>';
$aTmp[] = ' <description><![CDATA[{@channel_description}]]></description>';
$aTmp[] = '{@item}';
$aTmp[] = ' </channel>';
$sTemplateChannel = implode("\n", $aTmp);
unset($aTmp);

$aTmp = array();
$aTmp[] = ' <item>';
$aTmp[] = ' <title><![CDATA[{@item_title}]]></title>';
$aTmp[] = ' <link>{@item_link}</link>';
$aTmp[] = ' <description><![CDATA[{@item_description}]]></description>';
$aTmp[] = ' <category><![CDATA[{@item_category}]]></category>';
$aTmp[] = ' <guid><![CDATA[{@item_link}]]></guid>';
$aTmp[] = ' <pubDate>{@item_pubdate}</pubDate>'; //文章发布时间
$aTmp[] = ' </item>';
$sTemplateItem = implode("\n", $aTmp);
unset($aTmp);
}

if (!empty($this->_aChannel)){
$aTmpItem = array();
foreach ($this->_aChannel['items'] as $aItem){ //内层遍历item
$aParam = array(
'{@item_title}'=> self::convert_encoding($aItem['title'], self::LOCAL_CHARSET),
'{@item_link}'=> $aItem['link'],
'{@item_description}'=> self::convert_encoding($aItem['description'], self::LOCAL_CHARSET),
'{@item_category}'=> self::convert_encoding($aItem['category'], self::LOCAL_CHARSET),
'{@item_pubdate}'=> gmdate("D, d M Y 23:59:59", $aItem['utc_timestemp']) .' GMT',
);
$aTmpItem[] = strtr($sTemplateItem, $aParam);
unset($aParam);$aParam=null;
}

$aParam = array(
'{@channel_title}'=> self::convert_encoding($this->_aChannel['channel']['title'], self::LOCAL_CHARSET),
'{@channel_link}'=> $this->_aChannel['channel']['link'],
'{@channel_description}'=> self::convert_encoding($this->_aChannel['channel']['description'], self::LOCAL_CHARSET),
'{@item}'=> implode("\n", $aTmpItem),
);

$aOutBuf = array();
$aOutBuf[] = '<?xml version="1.0" encoding="utf-8" ?>';
$aOutBuf[] = '<rss version="2.0">';
$aOutBuf[] = strtr($sTemplateChannel, $aParam);;
unset($aParam);$aParam=null;
$aOutBuf[] = '</rss>';
return implode("\n", $aOutBuf);
}else{
return null;
}
}
/**
* 对变量内容的进行字符编码转换
* @param string $sInCharset 转换前的字符集
* @param string $sOutCharset 转换后的字符集
* @param string | array $mixd 待转换的变量(数组或字符串)
* @return string | array 完成转换后的结果
*/
static public function convert_encoding(& $mixd, $sInCharset, $sOutCharset='utf-8') {
if ($sInCharset === $sOutCharset) //字符集相同时不转换
return $mixd;

if (is_array($mixd)) {
$tmp = array();
foreach ($mixd as $key => $val) {
$tmp[$key] = self::convert_encoding($sInCharset, $sOutCharset, $val);
}
return $tmp;
} else { //字符集相同时不转换
return mb_convert_encoding($mixd, $sOutCharset, $sInCharset);
}
}
}

使用的时候将里面的几个常量修改成你需要的参数,然后如下述用就能输出标准的rss代码。

本程序使用 GBK的本地环境字符集,如果你的本地环境是UTF-8,请修改这个条代码 LOCAL_CHARSET = 'gbk';


/*测试用例*/
$aChannel = array('title'=>'每周精选','description'=>'二手车最新新闻','link'=>'http://www.chemao.com.cn/baike-gonglue.html');
$o = new CRssBuilder($aChannel);
$aItem = array(
'title'=>'迎接Baby ,上车猫网甜蜜选购心仪POLO',
'link'=>'http://www.chemao.com.cn/baike/cwpolo.html',
'description'=>'我和老公相恋于大学,都是北方人。因为家里适合自己的就业机会少,毕业后两人一起来到杭州发展。拼搏了两年,去年7月我们终于结束了5年的爱情长跑,在西子湖畔与亲友一起见证了我们的爱情。',
'category'=>'每周精选',
'utc_timestemp'=>time()
);
$o->addItems($aItem);
$aItem = array(
'title'=>'为满足空间需求,买个二手MPV可还行!',
'link'=>'http://www.chemao.com.cn/baike/esmpv.html',
'description'=>'随着二胎政策与全民创业的逐步兴起,路面上跑的MPV越来越多,此类车型的强大用途已经让很多人爱不释手。而金九银十的到来不仅令新车优惠越来越大,二手车价格也在急剧跳水,这其中MPV的价格更是”一贬再贬“,对于想入手这类车型的网友来说,现在下手是绝好时机!下面,下面就为大家推荐几款二手车市场常见的热门MPV。',
'category'=>'每周精选',
'utc_timestemp'=>time()
);
$o->addItems($aItem);
echo $o->getSerialize();