最近做一个RSS在线聚合器,大部分RSS 2.0编码的XML编码.NET编译器都可以 正确读取,可是一些比如GBK编码,我们的.NET就读取不了,如果把那个XML的编 码手动改变成“gb2312”或者其它编码,也是读取不了。不过编码改 变不改变,IE都是可以正确查看的。下面怎么办,确实难住我了。改变编码怎么 样?我的RSS在线聚合器要读取的RSS 2.0文件不是下载到本地的文件,而是在线 阅读。那好,得到连接后,使用流可以很好的得到正确编码的XML流。下面见代码 啦:

1 private void Page_Load(object sender, System.EventArgs e)2 {3 rssRepeater.DataSource = ReturnReadResult( Request[ "url" ] );4 rssRepeater.DataBind( );5 }67 private DataTable ReturnReadResult( string rssUrl )8    {9      //构在DataTable表格10      DataTable dt = CreateDataTable();11       DataRow dr;1213      try 14      {15        XmlDocument xml = new XmlDocument();1617        //正常加载完全合格的RSS 2.0文件18         try19        {20           xml.LoadXml( rssUrl );21        }22         catch23        {24          //下面的措施 针对一些特别的RSS 2.0文件,比如下面的一个站点:25           //site :http://www.csdn.net/rss/rssfeed.aspx? rssid=1&bigclassid=1426          //按照常规是无法正 常加载的。需要进一步处理。比如一些.NET暂时不支持的编码,目前可以读取所 知的RSS 2.027           rssUrl = "http://soft.yesky.com/index.xml";28           System.Net.WebRequest wr = System.Net.WebRequest.Create( rssUrl );29          System.Net.WebResponse srp = wr.GetResponse ();30          //加入了把原先编码都转化成了2312gb形式。 31          StreamReader sr = new StreamReader( srp.GetResponseStream() ,System.Text.Encoding.GetEncoding( "gb2312" ));3233          xml.LoadXml( sr.ReadToEnd( ).Trim( ) );34          sr.Close();35          srp.Close();36        }3738        //读取总标题信息,可以判断是否有图片展示39        try40        {41           titleLabel.Text = xml.SelectSingleNode ("/rss/channel/title").InnerText42             + "<br><a href = "43             + xml.SelectSingleNode("//image/link").InnerText44             + ">"45             + "<img src="46            + xml.SelectSingleNode("//image/url").InnerText47             + " border = no></a><br>"48            + xml.SelectSingleNode ("/rss/channel/description").InnerText49             + "<br>"50            +  xml.SelectSingleNode("/rss/channel/link").InnerText;51         }52        catch53         {54          try55          {56             titleLabel.Text = xml.SelectSingleNode ("/rss/channel/title").InnerText57               + "<br>"58              + xml.SelectSingleNode("/rss/channel/description").InnerText59              + "<br>"60               + xml.SelectSingleNode ("/rss/channel/link").InnerText;61           }62          catch63          {64            //假如没有频道进行说明的情况下65             titleLabel.Text = xml.SelectSingleNode ("/rss/channel/title").InnerText66               + "<br>"67              + xml.SelectSingleNode("/rss/channel/link").InnerText;68           }69        }7071         XmlNodeList nodes = xml.SelectNodes("//item");7273        foreach( XmlNode item in nodes )74         {75          dr = dt.NewRow();76           foreach( XmlNode child in item.ChildNodes )77           {7879            switch( child.Name )80            {81               case "title":82                 dr[ "title" ] = child.InnerText;83                 break;84              case "link":85                dr[ "link" ] = child.InnerText;86                 break;87              case "author":88                dr[ "author" ] = child.InnerText;89                 break;90              case "guid":91                dr[ "guid" ] = child.InnerText;92                 break;93              case "category":94                dr[ "category" ] = child.InnerText;95                 break;96              case "pubDate":97                dr[ "pubDate" ] = child.InnerText;98                 break;99              case "description":100                dr[ "description" ] = child.InnerText;101                 break;102              case "comments":103                dr[ "comments" ] = child.InnerText;104                 break;105            }106           }107          dt.Rows.Add( dr );108         }109        return dt;110      } 111      catch ( Exception ex )112      {113        Response.Write( ex.ToString( ) );114         return null;115      }116    }117118//手动创立一个DataTable119    private DataTable CreateDataTable()120    {121      DataTable dt = new DataTable();122      DataColumn dc;123124       System.Type type;125      type = System.Type.GetType("System.String");126127       dc = new DataColumn( "title",type );128       dt.Columns.Add( dc );129130      dc = new DataColumn( "link", type );131       dt.Columns.Add( dc );132133      dc = new DataColumn( "author", type );134      dt.Columns.Add( dc );135136      dc = new DataColumn( "guid", type );137      dc.DefaultValue = "";138       dt.Columns.Add( dc );139140      dc = new DataColumn( "category", type );141       dc.AllowDBNull = true;142      dt.Columns.Add( dc );143144      dc = new DataColumn( "pubDate", type );145      dt.Columns.Add( dc );146147       dc = new DataColumn( "description", type );148       dc.AllowDBNull = true;149      dt.Columns.Add( dc );150151      dc = new DataColumn( "comments", type );152      dc.AllowDBNull = true;153      dt.Columns.Add( dc );154155       return dt;156    }

这样处理后,可以读取大 部分的RSS 2.0连接。

至于处理本地的文件使用StreamReader流转化编码 ,一样的处理。

其核心就是使用流转换编码。

更多相关文章

  1. xml文件正确性验证类的示例代码分析
  2. 详解xmlhttp组件获取远程文件并筛选出目标数据
  3. xml文件如何编辑的详情介绍
  4. 教你如何打开xml文件的详解
  5. XML文件要有根标签(错误)的代码解决分享
  6. 读取XML文件时报“前言中不允许有内容”错误处理办法详解
  7. 解析XML文件的几种方式对比的详细介绍
  8. XML文件使用SAX方法读取的示例代码
  9. XML文件使用DOM方法读取的示例代码

随机推荐

  1. 【Android】简单图片浏览器
  2. Android 解决Toast的延时显示问题
  3. Android中编码实现软件界面
  4. Android APP--建立简单的交互界面
  5. Android应用中使用Popupmenu
  6. Android安卓开发官方文档国内镜像
  7. android欢迎界面并执行任务
  8. Android中添加syslog功能
  9. SMS Library in Android
  10. android历史版本对应的api等级