您的位置:首页 > 编程语言 > ASP

ASP.NET下RSS新闻及其他网站新闻的读取

2007-12-21 21:36 309 查看
最近在用VS2005开发一个OA项目,项目中需要将新浪或其他网站的最新新闻放在OA首页显示。

具体实施过程中,遇到了一些问题。归纳一下,有三种方法:

1.直接嵌入网页代码

许多网站,如新浪、百度等,都提供了嵌入新闻的代码,使用相对简单,直接引用即可。本人在ASP.NET中嵌入时也遇到问题:如将嵌入代码放在<form></form>内会报错,放在<form></form>外却不会。其原因没有深究,因为毕竟这种代码嵌入后,其格式与项目要求有一定距离。

2.直接读XML文件,一般用于网站专门生成的XML文件。

这种方法最简单,几行语句便可搞定:

    // 读取XML数据源, XmlUrl是XML的URL地址
    DataSet ds = new DataSet();


ds.ReadXml(xmlUrl);
    // 绑定控件


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);


}

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(u
ba47
rl);


        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下实现,仅提供后台代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐