最近做一個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 } 6 7 private DataTable ReturnReadResult( string rssUrl ) 8 { 9 //构在DataTable表格 10 DataTable dt = CreateDataTable(); 11 DataRow dr; 12 13 try 14 { 15 XmlDocument xml = new XmlDocument(); 16 17 //正常加载完全合格的RSS 2.0文件 18 try 19 { 20 xml.LoadXml( rssUrl ); 21 } 22 catch 23 { 24 //下面的措施 针对一些特别的RSS 2.0文件,比如下面的一个站点: 25 //site :http://www.csdn.net/rss/rssfeed.aspx? rssid=1&bigclassid=14 26 //按照常规是无法正 常加载的。需要进一步处理。比如一些.NET暂时不支持的编码,目前可以读取所 知的RSS 2.0 27 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" )); 32 33 xml.LoadXml( sr.ReadToEnd( ).Trim( ) ); 34 sr.Close(); 35 srp.Close(); 36 } 37 38 //读取总标题信息,可以判断是否有图片展示 39 try 40 { 41 titleLabel.Text = xml.SelectSingleNode ("/rss/channel/title").InnerText 42 + "<br><a href = " 43 + xml.SelectSingleNode("//image/link").InnerText 44 + ">" 45 + "<img src=" 46 + xml.SelectSingleNode("//image/url").InnerText 47 + " border = no></a><br>" 48 + xml.SelectSingleNode ("/rss/channel/description").InnerText 49 + "<br>" 50 + xml.SelectSingleNode("/rss/channel/link").InnerText; 51 } 52 catch 53 { 54 try 55 { 56 titleLabel.Text = xml.SelectSingleNode ("/rss/channel/title").InnerText 57 + "<br>" 58 + xml.SelectSingleNode("/rss/channel/description").InnerText 59 + "<br>" 60 + xml.SelectSingleNode ("/rss/channel/link").InnerText; 61 } 62 catch 63 { 64 //假如没有频道进行说明的情况下 65 titleLabel.Text = xml.SelectSingleNode ("/rss/channel/title").InnerText 66 + "<br>" 67 + xml.SelectSingleNode("/rss/channel/link").InnerText; 68 } 69 } 70 71 XmlNodeList nodes = xml.SelectNodes("//item"); 72 73 foreach( XmlNode item in nodes ) 74 { 75 dr = dt.NewRow(); 76 foreach( XmlNode child in item.ChildNodes ) 77 { 78 79 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 } 117 118//手动创立一个DataTable 119 private DataTable CreateDataTable() 120 { 121 DataTable dt = new DataTable(); 122 DataColumn dc; 123 124 System.Type type; 125 type = System.Type.GetType("System.String"); 126 127 dc = new DataColumn( "title",type ); 128 dt.Columns.Add( dc ); 129 130 dc = new DataColumn( "link", type ); 131 dt.Columns.Add( dc ); 132 133 dc = new DataColumn( "author", type ); 134 dt.Columns.Add( dc ); 135 136 dc = new DataColumn( "guid", type ); 137 dc.DefaultValue = ""; 138 dt.Columns.Add( dc ); 139 140 dc = new DataColumn( "category", type ); 141 dc.AllowDBNull = true; 142 dt.Columns.Add( dc ); 143 144 dc = new DataColumn( "pubDate", type ); 145 dt.Columns.Add( dc ); 146 147 dc = new DataColumn( "description", type ); 148 dc.AllowDBNull = true; 149 dt.Columns.Add( dc ); 150 151 dc = new DataColumn( "comments", type ); 152 dc.AllowDBNull = true; 153 dt.Columns.Add( dc ); 154 155 return dt; 156 }
這樣處理後,可以讀取大 部分的RSS 2.0連線。
至於處理本地的檔案使用StreamReader流轉換編碼 ,一樣的處理。
其核心就是使用流轉換編碼。
以上是XmlDocument XML編碼轉換的範例程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!