最近在用VS2005开发一个OA项目,项目中需要将新浪或其他网站的最新新闻放在OA首页显示。
具体实施过程中,遇到了一些问题。归纳一下,有三种方法:
1.直接嵌入网页代码
许多网站,如新浪、百度等,都提供了嵌入新闻的代码,使用相对简单,直接引用即可。本人在ASP.NET中嵌入时也遇到问题:如将嵌入代码放在<form></form>内会报错,放在<form></form>外却不会。其原因没有深究,因为毕竟这种代码嵌入后,其格式与项目要求有一定距离。
2.直接读XML文件,一般用于网站专门生成的XML文件。
这种方法最简单,几行语句便可搞定:
// 读取XML数据源, XmlUrl是XML的URL地址
DataSet ds
=
new
DataSet();
ds.ReadXml(xmlUrl );
ds.ReadXml(xmlUrl );
// 绑定控件
rptNews.DataSource = ds;
rtpNews.DataBind();
rptNews.DataSource = ds;
rtpNews.DataBind();
3.读取RSS新闻
许多网站都提供了RSS新闻,为项目引用提供了不少方便,大多数用第2种方法可以实现,但有的网站如新浪新闻提供的RSS中用XML读取时会出现无效的字符问题。解决方案如下:
/**/
/// <summary>
/// 新浪新闻RSS读取
/// </summary>
/// <param name="xmlUrl">新浪新闻RSS地址:"http://rss.sina.com.cn/news/marquee/ddt.xml"</param>
private void ReadRss( string xmlUrl)
... {
try
...{
// 读取网页
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(xmlUrl);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new System.IO.StreamReader(stream);
// Xml对象
XmlDocument xd = new XmlDocument();
// 转换XML不合法字符并载入XML
xd.LoadXml(ConvertHex(sr.ReadToEnd()));
// 关闭
sr.Close();
stream.Close();
response.Close();
// 移除多余的记录(只留8项记录)
XmlNodeList xnlItem = xd.SelectNodes("//rss/channel/item");
for (int i = xnlItem.Count - 1; i >= 8; i--)
xd.SelectNodes("//rss/channel").Item(0).RemoveChild(xnlItem.Item(i));
// 绑定数据源
rptNews.DataSource = xd.SelectNodes("//rss/channel/item");
}
catch
...{
rptNews.DataSourceID = "";
}
finally
...{
rptNews.DataBind();
}
}
/**/ /// <summary>
/// 将部分无效字符替换成空
/// </summary>
/// <param name="responseXml">Gta服务器Response后返回的Xml数据</param>
/// <returns>string</returns>
private string ConvertHex( string responseXml)
... {
UTF8Encoding encoding = new UTF8Encoding();
Byte[] responseByteArr = encoding.GetBytes(responseXml);
for (int i = 0; i < responseByteArr.Length; i++)
...{
if (responseByteArr[i] < 32) responseByteArr[i] = 32;
}
return encoding.GetString(responseByteArr);
}
/// 新浪新闻RSS读取
/// </summary>
/// <param name="xmlUrl">新浪新闻RSS地址:"http://rss.sina.com.cn/news/marquee/ddt.xml"</param>
private void ReadRss( string xmlUrl)
... {
try
...{
// 读取网页
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(xmlUrl);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new System.IO.StreamReader(stream);
// Xml对象
XmlDocument xd = new XmlDocument();
// 转换XML不合法字符并载入XML
xd.LoadXml(ConvertHex(sr.ReadToEnd()));
// 关闭
sr.Close();
stream.Close();
response.Close();
// 移除多余的记录(只留8项记录)
XmlNodeList xnlItem = xd.SelectNodes("//rss/channel/item");
for (int i = xnlItem.Count - 1; i >= 8; i--)
xd.SelectNodes("//rss/channel").Item(0).RemoveChild(xnlItem.Item(i));
// 绑定数据源
rptNews.DataSource = xd.SelectNodes("//rss/channel/item");
}
catch
...{
rptNews.DataSourceID = "";
}
finally
...{
rptNews.DataBind();
}
}
/**/ /// <summary>
/// 将部分无效字符替换成空
/// </summary>
/// <param name="responseXml">Gta服务器Response后返回的Xml数据</param>
/// <returns>string</returns>
private string ConvertHex( string responseXml)
... {
UTF8Encoding encoding = new UTF8Encoding();
Byte[] responseByteArr = encoding.GetBytes(responseXml);
for (int i = 0; i < responseByteArr.Length; i++)
...{
if (responseByteArr[i] < 32) responseByteArr[i] = 32;
}
return encoding.GetString(responseByteArr);
}
4.新闻网页读取后二次处理
还有一些网站并不提供RSS新闻,但提供了嵌入代码,如果完全按其格式嵌入页面,往往不能满足客户要求,以百度新闻为例,其代码是一个JavaScript的document.write语句,但页面较短,读取速度较快,于是便采用了读取后二次处理的办法,代码如下:
/**/
/// <summary>
/// 百度新闻读取
/// </summary>
/// <param name="url">百度新闻url:"http://news.baidu.com/n?cmd=1&class=civilnews&pn=1&tn=newsbrofcu"</param>
private void ReadBaidu( string url)
... {
try
...{
// 读取百度新闻网页
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new System.IO.StreamReader(stream);
string strHtml = sr.ReadToEnd();
sr.Close();
stream.Close();
response.Close();
// string start = "document.write('<div style="margin-bottom:10px"><a href="http://news.baidu.com" target=_blank><img src="http://www.baidu.com/search/img/slogo-news.gif" width="60" height="21" border="0" align="absbottom"></a> <a href="http://news.baidu.com/n?cmd=1&class=civilnews&pn=1" target="_blank" class="blk">国内新闻</a></div><div style="text-align:left;table-layout:fixed;word-wrap:break-word;width:100%" class=baidu>";
// string end = "<div style="margin-top:5px;font-size:12px"><a href="http://news.baidu.com/n?cmd=1&class=civilnews&pn=1" target="_blank" class="more">更多>></a></div></div>')";
// strHtml = strHtml.Substring(449, strHtml.Length - 449 - 175);
// 从449位开始搜索链接
int i = 449;
int j = i - 4;
int count = 0;
StringBuilder sb = new StringBuilder();
// 只取8条记录(count)
while ((i = strHtml.IndexOf("<a ", j + 4)) >= 0 && (j = strHtml.IndexOf("</a>", j + 4)) >= 0 && count < 8)
...{
sb.AppendFormat("<a class='FontBTH' {0}", strHtml.Substring(i + 3, j + 4 - i - 2));
count += 1;
}
// 显示链接
divBaidu.InnerHtml = sb.ToString();
}
catch
...{
}
}
/// 百度新闻读取
/// </summary>
/// <param name="url">百度新闻url:"http://news.baidu.com/n?cmd=1&class=civilnews&pn=1&tn=newsbrofcu"</param>
private void ReadBaidu( string url)
... {
try
...{
// 读取百度新闻网页
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new System.IO.StreamReader(stream);
string strHtml = sr.ReadToEnd();
sr.Close();
stream.Close();
response.Close();
// string start = "document.write('<div style="margin-bottom:10px"><a href="http://news.baidu.com" target=_blank><img src="http://www.baidu.com/search/img/slogo-news.gif" width="60" height="21" border="0" align="absbottom"></a> <a href="http://news.baidu.com/n?cmd=1&class=civilnews&pn=1" target="_blank" class="blk">国内新闻</a></div><div style="text-align:left;table-layout:fixed;word-wrap:break-word;width:100%" class=baidu>";
// string end = "<div style="margin-top:5px;font-size:12px"><a href="http://news.baidu.com/n?cmd=1&class=civilnews&pn=1" target="_blank" class="more">更多>></a></div></div>')";
// strHtml = strHtml.Substring(449, strHtml.Length - 449 - 175);
// 从449位开始搜索链接
int i = 449;
int j = i - 4;
int count = 0;
StringBuilder sb = new StringBuilder();
// 只取8条记录(count)
while ((i = strHtml.IndexOf("<a ", j + 4)) >= 0 && (j = strHtml.IndexOf("</a>", j + 4)) >= 0 && count < 8)
...{
sb.AppendFormat("<a class='FontBTH' {0}", strHtml.Substring(i + 3, j + 4 - i - 2));
count += 1;
}
// 显示链接
divBaidu.InnerHtml = sb.ToString();
}
catch
...{
}
}
以上在ASP.NET 2.0下实现,仅提供后台代码。