您的位置:首页 > 其它

献给开发者的大礼--打造CSDN论坛专用阅读器(电脑报2006年11月6日 第44期)

2006-11-07 13:40 351 查看

CSDN.NET是中国著名的IT技术社区,为IT专业技术人员提供最全面的信息传播和服务平台。每天,大量的开发者都会到论坛上看帖和回帖,但是在使用过程中,我感觉有些不方便,主要表现在以下几点:

帖子数量多,还没看到就已经沉下去;
回帖速度快,无法及时获得帖子状态;
广告比较多,看帖速度慢;

所以,我根据自己的使用习惯,用C#编写了一个CSDN论坛阅读器--Csdn Reader。程序运行界面如图所示。





下面,我就来介绍一下它是如何编写的。

一、 读取帖子列表

  由于不可能获得网站后台数据,我只能通过分析网页的源代码来得到需要的数据。为了获得最新的帖子列表,我使用了以下方法。

1. HttpWebRequest/ HttpWebResponse

  System.Net.HttpWebRequest和System.Net.HttpWebResponse类负责发送以及接收请求,使用户能够直接与使用 HTTP 的服务器交互。

  例如,要获得“.NET技术 ”
(http://community.csdn.net/Expert/ForumsList.asp?typenum=1&roomid=52)的源代码,
  首先,根据指定的网页地址创建HttpWebRequest对象
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
  然后,创建HttpWebResponse对象接收服务器要返回的信息,也就是源代码,
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  最后,将获取的信息读取出来即可。
// encoding是网页使用的编码,不设置则为默认值:UTF-8
System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), encoding);
//读取内容到字符串
string Html = sr.ReadToEnd();

2. 正则表达式

分析帖子列表的html源代码,可以发现显示帖子的html格式如下:
<a href="/Expert/TopicView1.asp?id=帖子ID" target="_blank">帖子标题</a>
</td>
<td align="right">用户</td>
<td width="30" align="right">分数</td>
<td width="30" align="right">回复</td>
<td width="80" align="right">时间</td>
这样,就可以建立如下的正则表达式:
string strRegex =
@"<a[^<]*TopicView1.asp[^<]*id=(?<ID>[^<]*)""[^<]*target[^<]*>(?<topic>[^<]*)</a>[^<]*</td>[^<]*<td[^>]*>(?<user>[^<]*)</td>[^<]*<td[^>]*>(?<Points>[^<]*)</td>[^<]*<td[^>]*>(?<Replies>[^<]*)</td>[^<]*<td[^>]*>(?<ReplayTime>[^<]*)</td>";
小知识:什么是正则表达式?
  正则表达式,就是用某种模式去匹配一类字符串的一个公式。正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速分析大量文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。
然后,通过Match对象就很容易得到帖子的相关信息。代码如下:
Regex r;
MatchCollection m;
r = new Regex(strRegex, RegexOptions.IgnoreCase);
m = r.Matches(strHTML);
for (int i = 0; i < m.Count; i++)
{
Topic t = new Topic(m[i].Groups["ID"].Value
, m[i].Groups["topic"].Value
, m[i].Groups["user"].Value
, m[i].Groups["Points"].Value
, m[i].Groups["Replies"].Value
, m[i].Groups["ReplayTime"].Value);i
}
这里,我建了一个Topic类去保存帖子的各项属性,以方便对帖子列表显示进行控制。比如对于新贴子用一个特别的图标表示:
if (int.Parse(t.Replies) == 0)
item1.ImageKey = "NewTopic";

二、 看帖

打开任一帖子的html代码,可以发现它实际上是一个XML文件,这时就需要使用XSLT。
小知识:什么是XSLT
XSLT的英文标准名称为eXtensible Stylesheet Language Transformation(可扩展样式表语言转换)。XSLT可以将源 XML 文档的内容转换为另一个格式或结构不同的文档。
由于篇幅有限,这里我就不具体介绍XSLT,其相关信息读者可以查看MSDN。另外, VS.NET2005编辑器支持调试XSLT,可以随时查看转换效果。
调用XSL的代码如下:
XmlDocument xml = new XmlDocument();
//加载帖子的XML源代码
xml.LoadXml(strHTML);
XslCompiledTransform xslt = new XslCompiledTransform();
//加载XSLT
xslt.Load(Application.StartupPath.Replace(@"\", @"\\") + @"\\csdn.xsl");
//转换后输出到字符串
System.IO.StringWriter writer = new System.IO.StringWriter();
xslt.Transform(xml, null, writer);
strHtml = writer.ToString();
//最后将转换后的HTML显示到WebBrowser控件,IE为控件名
this.IE.Document.Write(strHtml);

三、 回帖

看贴一定要回帖。同样要使用HttpWebRequest/ HttpWebResponse类,但是这时是向服务器发送数据,需要在使用GetResponse创建HttpWebResponse对象之前先向HttpWebRequest对象写入需要发送的数据,代码如下:
//设置请求为Post
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
//将发送的数据转换成byte数组
byte[] b = encoding.GetBytes(PostData);
//将数据写入到HttpWebRequest对象
request.ContentLength = b.Length;
System.IO.Stream sw =request.GetRequestStream();
sw.Write(b, 0, b.Length);
sw.Close();
小结
这里介绍的只是CSDN Reader的基本功能。读者可以到http://feiyun0112.cnblogs.com/下载最新的源代码。我会不断的完善和更新,希望大家多提宝贵的意见和建议。
刊登于 电脑报2006年11月6日 第44期
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐