DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> XmlDocument XML編碼轉換
XmlDocument XML編碼轉換
編輯:XML詳解     

最近做一個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流轉化編碼,一樣的處理。

  其核心就是使用流轉換編碼。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved