Asp.Net生成RSS方法
一、RSS简介
什么是RSS?
RSS是一种网页内容联合格式(web content sydication format)。
它的名字是Really Simple Syndication的缩写。
RSS是XML的一种。所有的RSS文档都遵循XML 1.0规范,该规范发布在W3C网站上。
在一个RSS文档的开头是一个<rss>节点和一个规定的属性version,该属性规定了该文档将以RSS的哪个版本表示。如果该文档以这个规范来表示,那么它的version属性就必须等于2.0。
在<rss>节点的下一级是一个独立的<channel>节点,该节点包含关于channel的信息和内容。
必需的频道节点
下面有一份必须包含的频道(channel)节点的列表,每一个都有一个简单的描述、一个例子、应该出现的位置和更详细描述的超链接(以http://www.114390.com为例)。
元素 |
描述 |
范例 |
title |
频道(channel)名称。它可以告诉别人如何访问你的服务。如果你有一个与你的RSS文件内容一致的HTML网站,你的title元素值应该与你的网站的标题相同。 |
皮皮书屋 |
link |
响应该频道的网站的URL |
http://www.114390.com |
description |
关于该频道的描述 |
这里只有一些还不错的电子书。 |
可选的频道元素
下面是可选的频道元素(channel)中可以包含的元素列表 :
节点 |
描述 |
范例 |
language |
使用的语言。这允许聚合器对所有的意大利语站点分组。 |
en-us |
copyright |
版权声明 |
Copyright 2002, Spartanburg Herald-Journal |
managingEditor |
内容负责人的Email |
geo@herald.com (George Matesky) |
webMaster |
技术人员的Email |
betty@herald.com (Betty Guernsey) |
pubDate |
内容的发布时间 |
Sat, 07 Sep 2002 00:00:01 GMT |
lastBuildDate |
最后更新时间 |
Sat, 07 Sep 2002 09:42:31 GMT |
category |
指定该频道所属的一个或多个分类。遵循与item级category元素相同的规则。 |
<category>Newspapers</category> |
generator |
生成该频道的程序名称 |
MightyInHouse Content System v2.3 |
docs |
指向rss格式文档的url地址? |
http://blogs.law.harvard.edu/tech/rss |
cloud |
允许所有进程注册一个cloud用于获得频道的更新通知,并为rss种子实现一个轻量级的发布订阅协议。 |
<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/> |
ttl |
ttl是Time to live的缩写。它指示cache的有效保存时间。 |
<ttl>60</ttl> |
image |
与频道一起显示的图片地址 |
|
rating |
该频道的统计图片地址 |
|
textInput |
指定一个textbox与该频道一起显示 |
|
skipHours |
告诉使用者哪些时段是可以忽略的 |
|
skipDays |
告诉使用着哪些天是可以忽略的 |
以下是频道(channel)元素中几个常用子节点的说明:
<channel>子节点<image>
l <image>是一个可选的<channel>子节点,该节点包含三个必需的子元素和三个可选的子元素。
l <url>是GIF、JPEG或PNG图像文件的URL地址,该图像代表整个频道 。
l <title>用于描述上面的图像,等同于HTML语言中的<img>的alt属性 。
l <link>是要连接的站点的url,当显示频道时,图像的连接指向该站点。
l <title>和<link>应该与频道的<title>和<link>有相同的值。
l 可选的节点包括<width>和<height>,它们是数字类型,指定图像的宽度和高度,单位为像素。
l <description>就是link的TITLE属性中文本,它将在调用网页时显示出来。
备注:
图像宽度的最大值为144,默认值为88
图像高度的最大值为400,默认值为31
<channel>子节点<cloud>
<cloud>是一个可选的<channel>子节点。
它指定一个可以支持rssCloud接口的web服务,rssCloud接口可以用HTTP-POST,XML-RPC或SOAP1.1实现。
它的目的是允许通知注册为cloud的进程频道被更新,从而实现一个轻量级的发布订阅协议。
<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure= "myCloud.rssPleaseNotify" protocol="xml-rpc" />
在这个例子中,为了请求频道通知,你需要发送一个XML-RPC消息到rpc.sys.com的80端口,路径为/RPC2。调用的过程为myCloud.rssPleaseNotify。
<channel>子节点<ttl>
<ttl>是一个可选的<channel>子节点。
ttl是time to live的缩写。它表示频道在被刷新前应该被缓存的时间。这使得rss源可以被一个支持文件共享的网络所管理,例如Gnutella
例如:<ttl>60</ttl>
<channel>子节点<textInput>
<textInput>是<channel>的可选的子节点,<textInput>包含四个子节点:
l <title>是提交按钮的标签。
l <description>是该文本输入区的描述。
l <name>是文本输入区的名称。
l <link>是处理文本输入的CGI脚本的URL。
使用<textInput>的目的有些神秘。你可以用它提供一个搜索引擎输入框,或让读者提供反馈信息。许多聚合器忽略该节点。
<item>的节点
一个频道可以包含许多项目(item)节点。一个项目可以代表一个故事——比如说一份报纸或杂志上的故事,如果是这样的话,那么项目的描述则是故事的概要,项目的链接则指向整个故事的存放位置。项目的所有节点都是可选的,但是至少要包含至少一个标题(title)和描述 (description)。以下是项目(item)节点中可以包含的元素列表 :
节点 |
描述 |
范例 |
title |
item的标题 |
Venice Film Festival Tries to Quit Sinking |
link |
item的URL |
http://www.nytimes.com/2002/09/07/movies/07FEST.html |
description |
item概要 |
Some of the most heated chatter at the Venice Film Festival this week was about the way that the arrival of the stars at the Palazzo del Cinema was being staged. |
author |
作者的email地址 |
xxx@qq.com |
category |
item可以包含在一个或多个分类中 |
Simpsons Characters |
comments |
与item相关的评论的地址 |
http://www.114390.com |
enclosure |
附加的媒体对象 |
|
guid |
可以唯一确定item的字符串 |
#ID |
pubDate |
item发布的时间 |
Sun, 19 May 2002 15:21:36 GMT |
source |
rss频道来源 |
Quotes of the Day |
以下是频道元素(channel)中几个常用子节点的说明:
<item>子节点<source>
<source>是<item>的可选节点。
它的值是item来自的rss频道的名称,从item的title衍生而来。它有一个必须包含的属性url, 该属性链接到XML序列化源。
<source url="http://www.114390.com">webapi</source>
该节点的作用是提高连接的声望,进一步推广新闻项目的源头。它可以用在聚合器的Post命令中。当从聚合器通过webblog访问一个item时,<source>能够自动被生成。
<item>子节点<enclosure>
<enclosure>是<item>的可选节点。
它有三个必要的属性。url属性指示enclosure的位置,length指出它的字节大小,type属性指出它的标准MIME类型。
url必须为一个http url。
<enclosure url="http://www.114390.com/........." length="12216320" type="audio/mpeg" />
<item>子节点<category>
<category>是<item>的可选节点。
它有一个可选属性或域,该属性是一个用来定义分类法的字符串。
该节点的值是一个正斜杠分割的字符串,它用来在指定的分类法中识别一个分级位置(hierarchic location)。处理器可以为分类的识别建立会话。(Processors may establish conventions for the interpretation of categories)下面有两个例子:
<category>Grateful Dead</category>
<category domain="http://www.114390.com">asp.net</category>
你可以根据你的需要为不同的域(domain)包含很多category节点,并且可以在相同域的不同部分拥有一个前后参照的item。
<item>子节点<pubDate>
<pubDate>是<item>的可选节点。
它的值是item发布的日期。如果它是一个没有到达的日期,聚合器在日期到达之前可以选择不显示该item。
<pubDate>Sun, 19 May 2002 15:21:36 GMT</pubDate>
<item>子节点<guid>
<guid>是<item>的可选节点。
guid是globally unique identifier的缩写。它是一个可以唯一识别item的字符串。当item发布之后,聚合器可以选择使用该字符串判断该item是否是新的。
<guid>http://www.114390.com</guid>
guid没有特定的语法规则,聚合器必须将他们看作一个字符串。生成具有唯一性的字符串guid取决于种子的源头。
如果guid节点有isPermaLink属性,并且值为真,读取器就会认为它是item的permalink。permalink是一个可在web浏览器中打开的url链接,它指向<item>节点所描述的全部item。
<guid isPermaLink="true">http://www.114390.com</guid>
isPermaLink是可选属性,默认值为真。如果值为假,guid将不会被认为是一个url或指向任何对象的url。
<item>子节点<comment>
<comment>是<item>的可选节点。
如果出现,它指向该item评论的url:
<comments>http://www.114390.com</comments>
<item>子节点<author>
<author>是<item>的可选节点。
它是item的作者的email。对于通过rss传播的报纸和杂志,作者可能是写该item所描述的文章的人。主要应用于webblogs(博客、论坛等),因为内容的作者很可能不是责任编辑或站长。对于个人维护的webblog,可忽略<author>节点。
二、C#生成RSS
rss生成帮助类:RssBuilder.css
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using myweb.BLL;
using myweb.DAL;
using myweb.Model;
using System.Xml;
using System.Collections.Generic;
using System.IO;
/// <summary>
/// RssBuilder 的摘要说明
/// </summary>
public class RssBuilder
{
/// <summary>
/// 生成RSS,写出文件
/// </summary>
/// <param name="XmlName">xml文件名称,格式xxx.xml</param>
/// <param name="XmlTitle">xml标题</param>
/// <param name="XmlDescription">xml描述</param>
/// <param name="ds">DataTable</param>
/// <returns></returns>
public bool BuildRSS(string XmlName, string XmlTitle, string XmlDescription, DataTable dt)
{
string LoadPath = System.Web.HttpContext.Current.Server.MapPath("~/rss/"); // RSS存放路径
if (!Directory.Exists(LoadPath))
{
Directory.CreateDirectory(LoadPath);
}
string domain = MyCLib.StrClass.GetDomain();
XmlTextWriter xtw = new XmlTextWriter(System.Web.HttpContext.Current.Server.MapPath("~/RSS/" + XmlName), System.Text.Encoding.GetEncoding("utf-8")); xtw.Formatting = Formatting.Indented;
xtw.WriteStartDocument();
//xtw.WriteProcessingInstruction("xml-stylesheet", "type='text/css' href='http://www.114390.com/images/font-awesome.min.css'"); // 增加头
xtw.WriteStartElement("rss"); // 增加rss节点
xtw.WriteAttributeString("version", "2.0"); xtw.WriteStartElement("channel"); // 增加channel节点
xtw.WriteElementString("title", XmlTitle); // 频道名称
xtw.WriteElementString("link", domain); // 频道的URL
xtw.WriteElementString("description", XmlDescription); // 频道的描述
xtw.WriteElementString("lastBuildDate ", DateTime.Now.ToString("r")); // 频道内容最后的修改日期 // foreach (TableRow tr in ds.Tables[0].Rows)
for (int i = 0; i < dt.Rows.Count; i++)
{
xtw.WriteStartElement("item");
//xtw.WriteAttributeString("id", (i + 1).ToString());
xtw.WriteElementString("title", dt.Rows[i]["title"].ToString());
xtw.WriteElementString("link", domain + "/info/" + dt.Rows[i]["ID"].ToString() + ".html"); // 链接地址
xtw.WriteElementString("description", dt.Rows[i]["description"].ToString()); // 描述
xtw.WriteElementString("pubDate", dt.Rows[i]["times"].ToString()); //发布时间
xtw.WriteElementString("guid", dt.Rows[i]["ID"].ToString()); //唯一标识
xtw.WriteEndElement();
}
xtw.WriteEndElement();
xtw.WriteEndElement();
xtw.WriteEndDocument();
xtw.Flush();
xtw.Close(); return true;
}
}
使用说明
DataTable dtNews = GetDataTable("select ID,title,description,times from news");
string fname = "rss.xml";
string xmltitle = "新闻";
string xmlDescription = "新闻";
RssBuilder rssbuild = new RssBuilder();
if (rssbuild.BuildRSS(fname, xmltitle, xmlDescription, dtNews))
{
Response.Write("生成成功");
}
生成的rss
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>今天头条</title>
<link>http://www.ceshi2.com</link>
<description>今天最新新闻和最热门资讯</description>
<lastBuildDate >Thu, 30 Jun 2016 16:11:47 GMT</lastBuildDate >
<item>
<title>编辑是最美丽的工作3</title>
<link>http://www.ceshi2.com/info/10.html</link>
<description>编辑是最美丽的工作3</description>
<pubDate>2016/6/25 17:28:03</pubDate>
<guid>10</guid>
</item>
<item>
<title>编辑是最美丽的工作2</title>
<link>http://www.ceshi2.com/info/9.html</link>
<description>编辑是最美丽的工作2</description>
<pubDate>2016/6/25 17:24:15</pubDate>
<guid>9</guid>
</item>
<item>
<title>美丽的明天1</title>
<link>http://www.ceshi2.com/info/4.html</link>
<description>美丽的明天1</description>
<pubDate>2016/6/24 16:38:40</pubDate>
<guid>4</guid>
</item>
<item>
<title>文章测试2</title>
<link>http://www.ceshi2.com/info/2.html</link>
<description>文章测试2</description>
<pubDate>2016/6/24 16:37:05</pubDate>
<guid>2</guid>
</item>
<item>
<title>文章测试1</title>
<link>http://www.ceshi2.com/info/1.html</link>
<description>文章测试1</description>
<pubDate>2016/6/24 15:07:31</pubDate>
<guid>1</guid>
</item>
</channel>
</rss>
Asp.Net生成RSS方法的更多相关文章
- asp.net生成RSS
经常看到博客.还有很多网站中有RSS订阅,今天就来玩玩asp.net生成RSS,在网上查找了相关资料 发现just soso,如下: aspx <?xml version="1.0&q ...
- asp.net 生成PDF方法
今天转博客园看到有人发表了一篇生成PFd的文章,准备自己也留一份准备以后用到的时候方便调用: 首先去itextsharp网站下载控件(https://sourceforge.net/projects/ ...
- asp.net生成二维码的方法
asp.net生成二维码的方法 [复制链接] 这个要利用一个Dll文件. 如下 Gma.QrCodeNet.Encoding.dll (105.5 KB, 下载次数: 27) 当然大家也可以直 ...
- asp.net 生成、解析条形码和二维码
原文 asp.net 生成.解析条形码和二维码 一.条形码 一维码,俗称条形码,广泛的用于电子工业等行业.比如我们常见的书籍背面就会有条形码,通过扫描枪等设备扫描就可以获得书籍的ISBN(Intern ...
- Spring MVC生成RSS源
下面的示例演示如何使用Spring Web MVC框架生成RSS源. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: 创建 ...
- asp.net生成word文档服务器配置
一.asp.net生成word文档,布署到正式的服务器上就出现 错误:System.Runtime.InteropServices.COMException (0x800A1098 ...
- Spring MVC-集成(Integration)-生成RSS源示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_rss_feed.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...
- ASP程序加密/解密方法大揭密
如今,用ASP技术构建的网站随处可见.由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的 ...
- asp.net生成店铺推广二维码,二维码中间加logo(源码)
二维条码比一维条码记载数据量更多,二维码条码是一种高密度.高信息含量的便携式数据文件,是实现证件及卡片等大容量.高可靠性信息自动存储.携带并可用机器自动识读的理想手段.而且可以记载更复杂的数据,比如图 ...
随机推荐
- Django 学习笔记之六 建立一个简单的博客应用程序
最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...
- HTTP - 内容编码
HTTP 应用程序有时在发送之前需要对内容进行编码.例如,在把很大的 HTML 文档发送给通过慢速连接上来的客户端之前,服务器可能就会对它进行压缩,这样有助于减少传输实体的时间. 内容编码过程 内容编 ...
- oracle 删除用户,表空间;循环删除表
select * from dba_tablespaces 说明:查看所有表空间 ----------------------------------------------------------- ...
- java中判空
一.概述 java中判等似乎很简单,==用来判断对象引用(内存地址)是否相同,equals用来判断值是否相同.你可以试用String对象轻松区分这一点. 那么在null判等(也就是判空操作)时呢? 可 ...
- Html特殊字符转义处理
#region 将Html特殊字符转义处理 /// <summary> /// 将Html特殊字符转义处理 /// </summary> ...
- 在windows下用FTP命令上传文件到Linux
在桌面新建个文件夹,命名成MySQL.rpm.把需要上传的文件放到这个文件夹里.打开cmd窗口,开始用下面命令操作: C:\Users\huyadi>cd C:\Users\huyadi\Des ...
- linux源码阅读笔记 jmpi指令(转)
jmpi是段间跳转指令,用于x86实模式下, 如:BOOTSEG = 0x0c70 jmpi 4, #BOOTSEG 假如当前段CS==00h,那么执行此指令后将跳转到段CS==0x0c70,当 ...
- Selenium如何使用自定义的Firefox配置文件?
一.自动保存文件 import os from selenium import webdriver fp = webdriver.FirefoxProfile() fp.set_preference( ...
- POJ 2568/ZOJ 1965 Decode the Tree
题意:在树中,每次删去节点值最小的叶子结点. 每删去一个点,就给出与这相连的点的值,直到最后只剩下一个根结点,给这N-1个数,重新建立这个树. 思路: 给出的节点号按次序存入到数组a中,将未给出的数存 ...
- HDU 1164 Eddy's research I
题目链接 题意 : 给你一个数,让你用它的素数质因子表示出来. 思路 : 先打一下表,因为会有重复的质因子,所以从大到小开始找,并且找到一个之后不能就接着往下找,要再找一遍这个数. #include ...