最近做一個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流轉化編碼 ,一樣的處理。
其核心就是使用流轉換編碼。