天天看點

實戰篇-六十六行完成簡潔的Rss輸出類

前言:

實戰篇-六十六行完成簡潔的Rss輸出類

rss測試輸出位址可見:

實戰篇-六十六行完成簡潔的Rss輸出類

rss 文檔示例:

實戰篇-六十六行完成簡潔的Rss輸出類
實戰篇-六十六行完成簡潔的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>

    <title>xml tutorial</title>

    <link>http://www.cyqdata.com/cyq1162/rss</link>

    <description>new xml tutorial on cyqdata.com</description>

</channel>

</rss> 

實戰篇-六十六行完成簡潔的Rss輸出類

從示例文檔上看,rss的基本構成:

1:channel一個

2:channel屬性若幹,有必選和n多可選。

3:channel下有n個item項,item也有若幹選項。

為此,簡單的說,隻要輸出以上格式的xml,簡單的rss也即成功了,下面進行代碼實戰。

一:實體類建立

要寫成完整點的rss版,費勁的不是要想怎麼輸出,而是要知道rss都有些什麼屬性,雖然基本文檔示例上看相當簡潔明了,

不過實作其屬性卻不是那麼一點半點的,為此,prop一個一個敲屬性的時候,就費了我不少時間

下面上我辛苦敲寫的實體類:

1:rsschannel

實戰篇-六十六行完成簡潔的Rss輸出類

rsschannel

2:rssitem

實戰篇-六十六行完成簡潔的Rss輸出類

rssitem

3:rssimage--圖檔logo輸出

實戰篇-六十六行完成簡潔的Rss輸出類

rssimage

最有技術含量的,就是上面三個實體類的敲入了,看着w3規範的屬性,一個一個的敲,很累人。

ok,有了三個的實體類,接下的事情變的相當簡單了。

二:建立簡潔rss類

1:建立rss類--構造函數相當簡單的初始化了一下基本資料。

實戰篇-六十六行完成簡潔的Rss輸出類
實戰篇-六十六行完成簡潔的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();

        }

    }

實戰篇-六十六行完成簡潔的Rss輸出類

2:建立生成rss--反射實體建立xml元素。

實戰篇-六十六行完成簡潔的Rss輸出類
實戰篇-六十六行完成簡潔的Rss輸出類

        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處理

                }

實戰篇-六十六行完成簡潔的Rss輸出類

函數分解1:建立節點元素

實戰篇-六十六行完成簡潔的Rss輸出類
實戰篇-六十六行完成簡潔的Rss輸出類

        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;

實戰篇-六十六行完成簡潔的Rss輸出類

函數分解2:反射循環建立子節點

實戰篇-六十六行完成簡潔的Rss輸出類
實戰篇-六十六行完成簡潔的Rss輸出類

        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)

                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);

實戰篇-六十六行完成簡潔的Rss輸出類

3:輸出rss

實戰篇-六十六行完成簡潔的Rss輸出類

        public string outxml

            get

                buildrss();

                return rssdoc.outerxml;

實戰篇-六十六行完成簡潔的Rss輸出類

至此,一個相當簡潔的rss類就完成了,小小數了一下,rss類一共花了66代碼[要是數上實體類,那代碼行就相當的驚人了],目前在保持良好閱讀格式下也隻能把代碼簡化到這種程度了。

 三:測試使用示例代碼

 1:怎麼使用,這個相當簡單了

實戰篇-六十六行完成簡潔的Rss輸出類
實戰篇-六十六行完成簡潔的Rss輸出類

    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;

實戰篇-六十六行完成簡潔的Rss輸出類

至此,本文就結束了,代碼太短,大夥可能刷的一眼就看完了,不過打完收工也到時間了。

最後:好久沒寫文章了,今天抽點時間寫成一篇,希望本文對大夥有點幫助,謝謝支援~

ps:傳說點一下推薦會有10個園豆,喜歡麻煩點一下“推薦”,thank you very much!!