zoukankan      html  css  js  c++  java
  • 发布一个RSS辅助类

    http://www.cnblogs.com/surfsky/archive/2009/12/03/1616230.html

    发布一个RSS辅助类,是使用 XmlSerializer 解析和编码rss xml的。希望对大家有用:)

    参考文档:

    ·http://cyber.law.harvard.edu/rss/rss.html

    ·http://www.cnblogs.com/rss

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    using Kingsoc;

    namespace Kingsoc.Net
    {
        /// <summary>
        /// RSS 单元
        /// </summary>
        public class RssItem
        {
            [XmlElement("title")]       public string Title;
            [XmlElement("link")]        public string Link;
            [XmlElement("description")] public string Description;
            [XmlElement("author")]      public string Author;
            [XmlElement("category")]    public string Category;
            [XmlElement("comments")]    public string Comments;
            [XmlElement("enclosure")]   public string Enclosure;
            [XmlElement("guid")]        public string Guid;
            [XmlElement("pubDate")]     public string PubDate;
            [XmlElement("source")]      public string Source;
        }

        /// <summary>
        /// RSS 频道
        /// </summary>
        [XmlInclude(typeof(RssItem))]
        public class RssChannel
        {
            [XmlElement("title")]           public string Title;
            [XmlElement("link")]            public string Link;
            [XmlElement("description")]     public string Description;

            [XmlElement("language")]        public string Language;
            [XmlElement("copyright")]       public string CopyRight;
            [XmlElement("managingEditor")]  public string ManagingEditor;
            [XmlElement("webMaster")]       public string WebMaster;
            [XmlElement("pubDate")]         public string PubDate;
            [XmlElement("lastBuildDate")]   public string LastBuildDate;
            [XmlElement("category")]        public string Category;
            [XmlElement("docs")]            public string Docs;
            [XmlElement("cloud")]           public string Cloud;
            [XmlElement("ttl")]             public string TTL;
            [XmlElement("image")]           public string Image;
            [XmlElement("rating")]          public string Rating;
            [XmlElement("textInput")]       public string TextInput;
            [XmlElement("skipHours")]       public string SkipHours;
            [XmlElement("skipDays")]        public string SkipDays;


            [XmlElement("item")]
            public List<RssItem> Items = new List<RssItem>();
        }

        /// <summary>
        /// RSS
        /// </summary>
        [XmlInclude(typeof(RssChannel))]
        [XmlRoot("rss")]
        public class Rss
        {
            [XmlElement("channel")]
            public RssChannel Channel;

            // 从XML字符串中解析
            public static Rss LoadXmlString(string xml)
            {
                return SerializationHelper.LoadXmlString(xml, typeof(Rss)) as Rss;
            }

            // 保存为XML字符串
            public string SaveXmlString()
            {
                return SerializationHelper.SaveXmlString(this);
            }

            // 读取指定URL的RSS,并解析之
            public static Rss GetRss(string url)
            {
                string xml = FetchPage(url);
                return SerializationHelper.LoadXmlString(xml, typeof(Rss)) as Rss;
            }

            // 创建示例
            public static Rss CreateSample()
            {
                Rss rss = new Rss();
                RssChannel channel = new RssChannel()
                {
                    Title = "Title",
                    Link = "Link",
                    Description = "Description",
                    Language = "zh-cn",
                    LastBuildDate = DateTime.Now.ToString(),
                    PubDate = DateTime.Now.ToString(),
                    TTL = "60"
                };

                channel.Items.Add(new RssItem()
                {
                    Title = "Title1",
                    Link = "Link",
                    Author = "Author",
                    PubDate = DateTime.Now.ToString(),
                    Guid = "?",
                    Description = "Description"
                });
                channel.Items.Add(new RssItem()
                {
                    Title = "Title2",
                    Link = "Link",
                    Author = "Author",
                    PubDate = DateTime.Now.ToString(),
                    Guid = "?",
                    Description = "Description"
                });
                channel.Items.Add(new RssItem()
                {
                    Title = "Title3",
                    Link = "Link",
                    Author = "Author",
                    PubDate = DateTime.Now.ToString(),
                    Guid = "?",
                    Description = "Description"
                });

                rss.Channel = channel;
                return rss;
            }
        }
    }


     

    使用到的几个附加函数

        public class PageFetcher
        {

            // 获取网页文本
            public static string FetchPage(string url)
            {
                String result;
                HttpWebRequest request = (HttpWebRequest)System.Net.HttpWebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Encoding enc = System.Text.Encoding.UTF8
                using (StreamReader sr = new StreamReader(response.GetResponseStream(), enc))
                {
                    result = sr.ReadToEnd();
                    sr.Close();
                }
                return result;
            }

        }

       public class SerializationHelper
       {
            // object -> xml string
            public static string SaveXmlString(object obj) {return SaveXmlString(obj, null); }
            public static string SaveXmlString(object obj, XmlAttributeOverrides overrides) {return SaveXmlString(obj, obj.GetType(), overrides);}
            public static string SaveXmlString(object obj, Type type, XmlAttributeOverrides overrides)
            {
                System.IO.MemoryStream stream = new MemoryStream();
                using (System.IO.StreamWriter writer = new System.IO.StreamWriter(stream))
                {
                    System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(type, overrides);
                    xs.Serialize(writer, obj);
                    writer.Close();
                }
                string str = UnicodeEncoding.UTF8.GetString(stream.GetBuffer());
                return str;
            }

            // xml string -> obj
            public static object LoadXmlString(string xmlString, Type type) {return LoadXmlString(xmlString, type, null);}
            public static object LoadXmlString(string xmlString, Type type, XmlAttributeOverrides overrides)
            {
                byte[] bytes = UnicodeEncoding.UTF8.GetBytes(xmlString);
                System.IO.MemoryStream stream = new MemoryStream(bytes);
                using (System.IO.StreamReader reader = new System.IO.StreamReader(stream))
                {
                    System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(type, overrides);
                    object obj = xs.Deserialize(reader);
                    reader.Close();
                    return obj;
                }
            }

       }

    测试代码:

        Rss rss = Rss.CreateSample();
        Console.WriteLine(rss.SaveXmlString());

        string url = "http://www.cnblogs.com/rss";
        rss = Rss.GetRss(url);

  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/surfsky/p/1616230.html
Copyright © 2011-2022 走看看