最近做一個RSS在線聚合器,大部分RSS 2.0編碼的XML編碼.NET編譯器都可以正確讀取,可是一些比如GBK編碼,我們的.Net就讀取不了,如果把那個XML的編碼手動改變成“gb2312”或者其它編碼,也是讀取不了。不過編碼改變不改變,IE都是可以正確查看的。下面怎麼辦,確實難住我了。改變編碼怎麼樣?我的RSS在線聚合器要讀取的RSS 2.0文件不是下載到本地的文件,而是在線閱讀。那好,得到連接後,使用流可以很好的得到正確編碼的XML流。下面見代碼啦:
1private void Page_Load(object sender, System.EventArgs e)
2 {
3 rssRepeater.DataSource = ReturnReadResult( Request[ "url" ] );
4 rssRepeater.DataBind( );
5 }
6
7private 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流轉化編碼,一樣的處理。
其核心就是使用流轉換編碼。