解析dom树和生成rss
我们学院的网站做得很烂,上面的新闻不提供rss订阅,每次看新闻都要跑到网站上去,非常不方便。我现在是就业负责人,万一上面有什么新的通知没有看到,那我的责任就大了。昨天,突然有一个想法,就是自己为其实现一个rss feed。
首先我考虑的是用rsslib,但发现rss lib生成的xml,普通的rss订阅器不识别,没办法,只能自己想办法解决,最后自己观察了一个rss的feed,了解了一下基本结构后自己实现了一个。主要有RssDocument、RssChannel、RssImage、RssItem几个类。其中RssDocument中含有一个 RssChannel,RssChannel中含有一个RssImage和多个RssItem。他们的类关系图如下:
各个类的代码就不解释了,都和简单。唯一值得一提是使用XmlDocument进行操作,这样做的目的:一个是使用XmlDocument的效率较高,另外一个就是不容易出现错误。当然也可以使用StringBuilder直接对字符串进行操作。
另外,一件要解决的事情就是如何解析html的问题,开始想用HtmlDocument,后来发现它使用起来不是很方便,而且效率也不高。但C#中没有提供其他的操作html的工具,我上网上找了一下,发现一个很好的东西SgmlReader,它可以将html转成标准的xhtml。这样的话,我们就可以用XmlDocument操作转换后的html了,转换的函数如下:
public XmlDocument ConvertHtml2Xhtml(string html)
{
using (SgmlReader reader = new SgmlReader())
{
reader.DocType = "HTML";
reader.InputStream = new StringReader(html);
using (StringWriter stringWriter = new StringWriter())
{
using (XmlTextWriter writer = new XmlTextWriter(stringWriter))
{
reader.WhitespaceHandling = WhitespaceHandling.None;
writer.Formatting = Formatting.Indented;
XmlDocument doc = new XmlDocument();
doc.Load(reader);
return doc;
}
}
}
}
下面的工作主要就是分析我们学院网站上新闻的源代码了,找到我要提取的新闻在dom中的位置,为了速度,我直接从根往下找的,为了方便也可以使用getElementsByTagName的方法进行,不过效率可能受到一点影响。
读取新闻的代码很简单,就不做任何解析了,不明白的可以留言,我会尽力回答的。
该程序源码如下:https://files.cnblogs.com/dlutwy/rss.zip
在程序中我设置了两种访问办法:第一种是http://localhost/rss/student.rss的方式,这web.config中设置了handle,但是我发现这种方式在我的免费空间中不好用,所以又写了一种方式:http://localhost/rss/rss.ashx?name=student.rss。
现在我已将其发布在我的空间中,软件学院的同学可以通过rss阅读器订阅学院公告了,订阅地址如下:
1、学生周知:http://aspspider.info/wangyou/rss.ashx?name=student.rss
2、教工周知:http://aspspider.info/wangyou/rss.ashx?name=teacher.rss
3、学院新闻:http://aspspider.info/wangyou/rss.ashx?name=news.rss
对于就业信息,我没有时间去分析那html,有想实现的可以加上。由于我的免费空间是国外的,所以访问起来可能会比较慢。如果你又任何问题,都请留言,谢谢。

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名小橋流水(包含链接)。如您有任何疑问或者授权方面的协商,请给我发邮件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述