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

最近做一个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流转化编码 ,一样的处理。

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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念