实战篇-六十六行完成简洁的Rss输出类

前言:

前天为 秋色园 增加了Rss  输出,因此相应的底层框架 CYQ.Data 也增加了Rss类,这里单独抽出来重新写了个通用Rss类,独成一篇。

Rss测试输出地址可见:

主站:http://www.cyqdata.com/rss  

用户:http://www.cyqdata.com/cnblogs/rss

 

 

具体RSS是什么也就不多介绍了,相关的语法和资料,可详见:w3school

Rss 文档示例:


<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
  <title>Autumn Gurden Page</title>
  <link>http://cyqdata.com</link>
  <description>Autumn Park is QBlog the official site, created by the passing autumn, based on the framework developed cyqdata data layer supports multiple users, multiple languages, multiple databases(access,mssql,oracle), directory level url and other powerful blog system</description>
  <item>
    <title>RSS Tutorial</title>
    <link>http://www.cyqdata.com/rss</link>
    <description>New RSS tutorial on cyqdata.com</description>
  </item>
  <item>
    <title>XML Tutorial</title>
    <link>http://www.cyqdata.com/cyq1162/rss</link>
    <description>New XML tutorial on cyqdata.com</description>
  </item>
</channel>
</rss> 

从示例文档上看,Rss的基本构成:

1:channel一个

2:channel属性若干,有必选和N多可选。

3:channel下有N个Item项,Item也有若干选项。

 

 

为此,简单的说,只要输出以上格式的xml,简单的Rss也即成功了,下面进行代码实战。

 

一:实体类创建

要写成完整点的Rss版,费劲的不是要想怎么输出,而是要知道RSS都有些什么属性,虽然基本文档示例上看相当简洁明了,

不过实现其属性却不是那么一点半点的,为此,prop一个一个敲属性的时候,就费了我不少时间

下面上我辛苦敲写的实体类:

1:RssChannel

RssChannel

2:RssItem

RssItem

3:RssImage--图片Logo输出

RssImage

 

最有技术含量的,就是上面三个实体类的敲入了,看着w3规范的属性,一个一个的敲,很累人。

 

OK,有了三个的实体类,接下的事情变的相当简单了。

 

二:创建简洁RSS类

1:新建Rss类--构造函数相当简单的初始化了一下基本数据。


    public class Rss
    {
        XmlDocument rssDoc;

        public RssChannel channel;
        public Rss()
        {
            rssDoc = new XmlDocument();
            rssDoc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><rss version=\"2.0\"><channel></channel></rss>");
            channel = new RssChannel();
        }
    }

2:创建生成RSS--反射实体创建xml元素。


        private void BuildRss()
        {
            XmlNode cNode = rssDoc.DocumentElement.ChildNodes[0];//取得channel元素
            ForeachCreateChild(cNode, channel);//Channel处理
            if (channel.RssImage != null)
            {
                ForeachCreateChild(Create("image", null, cNode), channel.RssImage);//Channel-Image处理
            }
            if (channel.Items.Count > 0)
            {
                foreach (RssItem item in channel.Items)
                {
                    ForeachCreateChild(Create("item", null,cNode), item);//Channel-Items处理
                }
            }
        }

函数分解1:创建节点元素


        private XmlNode Create(string name,string value,XmlNode parent)
        {
            XmlElement xNode=rssDoc.CreateElement(name);
            if (!string.IsNullOrEmpty(value))
            {
                xNode.InnerXml = value;
            }
            parent.AppendChild(xNode as XmlNode);
            return xNode as XmlNode;
        }

函数分解2:反射循环创建子节点


        private void ForeachCreateChild(XmlNode parent, object obj)
        {
            object propValue = null;
            PropertyInfo[] pis = obj.GetType().GetProperties();
            for (int i = 0; i < pis.Length; i++)
            {
                if (pis[i].Name == "Items" || pis[i].Name=="Image")
                {
                    continue;
                }
                propValue = pis[i].GetValue(obj, null);
                if (propValue == null || propValue == DBNull.Value)
                {
                    continue;
                }
                if (pis[i].Name == "Description")
                {
                    propValue = "<![CDATA[" + propValue.ToString() + "]]>";
                }
                Create(pis[i].Name.Substring(0, 1).ToLower() + pis[i].Name.Substring(1), propValue.ToString(), parent);
            }
        }

3:输出RSS

        public string OutXml
        {
            get
            {
                BuildRss();
                return rssDoc.OuterXml;
            }
        }

 

至此,一个相当简洁的RSS类就完成了,小小数了一下,RSS类一共花了66代码[要是数上实体类,那代码行就相当的惊人了],目前在保持良好阅读格式下也只能把代码简化到这种程度了。

 

 三:测试使用示例代码

 1:怎么使用,这个相当简单了


    public class RssDemo
    {
        public string GetRss()
        {
            Rss rss = new Rss();
            rss.channel.Title = "秋色园";
            rss.channel.Link = "http://www.cyqdata.com";
            rss.channel.Description = "秋色园-QBlog-Power by Blog.CYQ";
            for (int i = 0; i < 10; i++)
            {
                RssItem item = new RssItem();
                item.Title = string.Format("第{0}项", i);
                item.Link = "http://www.cyqdata.com";
                item.Description = "很长很长的内容";

                rss.channel.Items.Add(item);
            }
            return rss.OutXml;
        }
    }

 

至此,本文就结束了,代码太短,大伙可能刷的一眼就看完了,不过打完收工也到时间了。

 

最后:好久没写文章了,今天抽点时间写成一篇,希望本文对大伙有点帮助,谢谢支持~

PS:传说点一下推荐会有10个园豆,喜欢麻烦点一下“推荐”,thank you very much!!


时间: 2024-09-08 09:16:39

实战篇-六十六行完成简洁的Rss输出类的相关文章

关于下载GAE High Replication Datastore数据[实战篇]下

通过bulk loader可以批量上传下载数据,GAE支持xml,csv格式数据批量上传,以及xml,csv和文本 格式下载. 你可以选择自动生成一个bulkloader.yaml,或者手动编码来写一个bulk loader.谷歌不推荐手动编 写,个人也觉得自动生成才是王道. 如何自动生成bulkloader.yaml bulkloader.yaml是一个描述数据格式的配置文件,格式例如xml或csv.bulk loader进行数据导入时 需要这个配置文件来将外部数据(xml或csv)转换为中间

[PhalApi实战篇(1)]Redis队列处理异步任务

[PhalApi实战篇(1)]Redis队列处理异步任务 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 哈喽大家好呀!之前编写的PhalApi入门篇和进阶篇已经过去了好久了,在此之间也回答了很多小伙伴各种各样的问题,这里也希望吧里面一些问的比较多的和比较有趣的以及笔者在使用PhalApi一些新的体会,都提取出来为大家带来一些能够在实际开发中可以使用的技术或思想,那么我们就开始我们实战篇中的第一节 Redis队列处理异步任务 大家希望喵咪在Pha

iOS与JS交互实战篇(Swift/ObjC)

前言 ObjectiveC与Js交互是常见的需求,可对于新手或者所谓的高手而言,其实并不是那么简单明了.这里只介绍iOS7.0后出来的JavaScriptCore framework. 关于JavaScriptCore 本教程中所涉及到的几种类型: JSContext, JSContext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码 JSValue, JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等 JSExport, JSExpor

xen虚拟化实战系列(六)之xen虚拟机破解密码

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1285969 xen虚拟化实战系列文章列表 xen虚拟化实战系列(一)之xen虚拟化环境安装xen虚拟化实战系列(二)之xen虚拟机安装xen虚拟化实战系列(三)之xen虚拟机复制xen虚拟化实战系列(四)之xen虚拟机扩展磁盘空间一法xen虚拟化实战系列(五)之xen虚拟机扩展磁盘空间再一法xen虚拟化实战系列(六)之x

BootStrap智能表单实战系列(六)表单编辑页面的数据绑定_javascript技巧

什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 Mark Otto 和 Jacob Thornton 开发的.Bootstrap 是 2011 年八月在 GitHub 上发布的开源产品. Bootstrap 包的内容 基本结构:Bootstrap 提供了一个带有网格系统.链接样式.背景的基本结构.这将在 Bootst

JBuilder9+Weblogic7实战篇之工具篇(JDBC 1)

JBuilder9+Weblogic7实战篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 工具篇(配置JDBC 1)                                                                              作者:黄 凯         E_mail:hk_sz@163.com Weblogic7中配置J

Android多功能时钟开发案例(实战篇)_Android

上一篇为大家介绍的是Android多功能时钟开发基础内容,大家可以回顾一下,Android多功能时钟开发案例(基础篇) 接下来进入实战,快点来学习吧. 一.时钟在布局文件中我们看到,界面上只有一个TextView,这个TextView的作用就是显示一个系统的当前时间,同时这个时间还是一秒一秒跳的,要实现一秒一秒的跳就需要我们每隔一秒就要刷新一下,同时我们这里还考虑了切换到另一个Tab的时候,这个时间就不跳动了,这样就会减少这个对系统的占用,考虑到了这点我们在这里用到了Handler,通过hand

工作经常使用的SQL整理,实战篇(二)

原文:工作经常使用的SQL整理,实战篇(二)[原创] 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇(三)   接着上一篇"工作经常使用的SQL整理,实战篇(一)"继续讨论,这一篇中主要讨论增删改查,连接,分组和排序,通配符,视图,存储过程和事务,游标,触发器这些东西. 6.增删改查 插入 --插入用户表数据 insert into Tse_User(UserID, User

【SSRS】入门篇(六) -- 分组和总计

原文:[SSRS]入门篇(六) -- 分组和总计 通过[SSRS]入门篇(五) -- 设置报表格式的设计,一份简单格式的报表已产生,如下图: 这节来说说分组和总计: 根据日期.订单对数据进行分组 添加订单总计 添加每日总计 添加总计 对数据进行分组: 1.单击"设计"选项页.(如果看不到"行组.列组"窗格,右键单击设计图画,选择"视图 -> 分组".) 2.从"报表数据"窗格把"Date"字段拖放到&