首頁  >  文章  >  後端開發  >  XmlDocument XML編碼轉換的範例程式碼分享

XmlDocument XML編碼轉換的範例程式碼分享

黄舟
黄舟原創
2017-03-24 17:12:421935瀏覽

最近做一個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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn