实战篇-六十六行完成简洁的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!!

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/12/15/1906869.html

相关文章
|
Web App开发 JSON 前端开发
SAP UI5 进阶 - JSON 模型字段里的值,显示在最终 UI5 界面上的奥秘分析试读版
SAP UI5 进阶 - JSON 模型字段里的值,显示在最终 UI5 界面上的奥秘分析试读版
|
5月前
|
存储 XML 缓存
前端知识笔记(三十九)———Base64图片是什么?原理是什么?优缺点是什么?
前端知识笔记(三十九)———Base64图片是什么?原理是什么?优缺点是什么?
87 0
|
12月前
|
Dart C++
带你读《深入浅出Dart》二十四、编写第一个Flutter应用
带你读《深入浅出Dart》二十四、编写第一个Flutter应用
|
JSON 数据格式
通过一个具体的例子,深入了解 SAP UI5 控件数据双向绑定的工作原理和问题排查方法试读版
通过一个具体的例子,深入了解 SAP UI5 控件数据双向绑定的工作原理和问题排查方法试读版
|
Kubernetes API 调度
【k8s 系列】k8s 学习二十七-2,k8s 自身原理 2
前面我们说到 K8S 的基本原理和涉及的四大组件,分享了前两个组件 etcd 和 ApiServer 这一次我们接着分享一波
112 0
|
Kubernetes 监控 API
【k8s 系列】k8s 学习二十七-3,k8s 自身原理 3
前面有分享到 master 主节点上的 四个组件,etcd,ApiServer,scheduler,controller manager
|
Kubernetes 监控 Linux
【k8s 系列】k8s 学习二十七 - 5,k8s 自身原理 5
我们知道容器是通过 pod 来承载的,我们在 k8s 中,服务都是跑在 pod 里面的,pod 里面可以跑 1 个容器,或者跑多个容器,那么咱们 pod 里面跑 1 个服务容器,咱真的就以为里面就只有这样个容器吗
|
存储 Kubernetes API
【k8s 系列】k8s 学习二十七-1,k8s 自身原理 1
咱们从 pod 一直分享到最近的 Statefulset 资源,到现在好像我们只是知道如何使用 k8s,如何按照 k8s 设计好的规则去应用,去玩 k8s
152 0
|
存储 Kubernetes 监控
【k8s 系列】k8s 学习二十七 - 4,k8s 自身原理 4
前面咱们分享了 mater 和 worker 节点里面都有哪些组件,他们又是各自主要负责的工作是什么,现在我们心里应该都有数了吧
135 0
|
缓存 iOS开发
iOS网络编程之六——数据缓存类NSURLCache使用解析
iOS网络编程之六——数据缓存类NSURLCache使用解析
191 0