Rumah > pembangunan bahagian belakang > Tutorial XML/RSS > XmlDocument XML编码转换的示例代码分享

XmlDocument XML编码转换的示例代码分享

黄舟
Lepaskan: 2017-03-24 17:12:42
asal
1989 orang telah melayarinya

最近做一个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    }
Salin selepas log masuk

这样处理后,可以读取大 部分的RSS 2.0连接。

至于处理本地的文件使用StreamReader流转化编码 ,一样的处理。

其核心就是使用流转换编码。

Atas ialah kandungan terperinci XmlDocument XML编码转换的示例代码分享. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan