今天写了一个简单的新浪新闻RSS操作类库

2024-03-20 01:38

本文主要是介绍今天写了一个简单的新浪新闻RSS操作类库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天,有位群友问我如何获新浪新闻列表相关问题,我想,用正则表达式网页中取显然既复杂又不一定准确,现在许多大型网站都有RSS集合,所以我就跟他说用RSS应该好办一些。

 

一年前我写过一个RSS阅读器,不过,打新浪相关的XML文件看了一下,发现RSS2.0 和一年前的不大一样了,但具体怎么处理,几句话也很难讲得清楚,所以,我干脆写了一个类库给他,直接调用。

 

类库不是很复杂,主要两个功能:

一、通过新浪的根频道XML在把所有频道的信息读出来,使用递归连同子节点也读取出来。

二、指定频道URL的XML文件来获取新闻信息。

 

首先,我们写两个类,一个用于保存新闻个息,另一个用于保存频道信息。

    /// <summary>
/// 新闻记录实体
/// </summary>
[Serializable]
public  class NewsItem
{
/// <summary>
/// 新闻标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 新闻链接
/// </summary>
public string Link { get; set; }
/// <summary>
/// 作者
/// </summary>
public string Author { get; set; }
/// <summary>
/// 分类
/// </summary>
public string Category { get; set; }
/// <summary>
/// 发布时间
/// </summary>
public DateTime PubDate { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 其它说明
/// </summary>
public string Comments { get; set; }
}


 

    /// <summary>
/// 新闻频道列表 
/// </summary>
[Serializable]
public  class OutLine
{
/// <summary>
/// 频道标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 频道文本
/// </summary>
public string Text { get; set; }
/// <summary>
/// 频道类型-RSS
/// </summary>
public string Type { get; set; }
/// <summary>
/// XML地址
/// </summary>
public string xmlUrl { get; set; }
/// <summary>
/// HTML地址
/// </summary>
public string htmlUrl { get; set; }
private List<OutLine> _olChildren = new List<OutLine>();
/// <summary>
/// 子频道
/// </summary>
public List<OutLine> ChildrenOutline
{
get { return _olChildren; }
}
}


 

好,接下来对应的两类,分别获取频道列表和新闻列表。

    /// <summary>
/// 新闻项管理类
/// </summary>
public class NewsManager
{
/// <summary>
/// 根据输入的XML地址获取新闻列表。
/// </summary>
/// <param name="xmlUrl">新闻频道的XML地址</param>
/// <returns>NewsItem的结果集合</returns>
public List<NewsItem> GetNewsItemList(string xmlUrl)
{
List<NewsItem> _myNews = new List<NewsItem>();
XElement myRoot = XElement.Load(xmlUrl);
var theItems =
from xe in myRoot.Element("channel").Elements("item")
select xe;
foreach (XElement e in theItems)
{
_myNews.Add(new NewsItem()
{
Title = (string)e.Element("title"),
Link = (string)e.Element("link"),
Author = (string)e.Element("author"),
Category = (string)e.Element("category"),
PubDate = (DateTime)e.Element("pubDate"),
Comments = (string)e.Element("comments"),
Description = (string)e.Element("description")
});
}
return _myNews;
}
}


 

    /// <summary>
/// 自动获取频道列表类
/// </summary>
public class OutlineManager
{
/// <summary>
/// 获取频道列表,包含子节点
/// </summary>
/// <param name="xmlUrl">根频道地址</param>
/// <returns></returns>
public List<OutLine> GetCannels(string xmlUrl)
{
List<OutLine> _list = new List<OutLine>();
XElement root = XElement.Load(xmlUrl);
var firstOutline = root.Element("body").Elements("outline");
foreach (XElement xitem in firstOutline)
{
OutLine myRootOutline = new OutLine
{
Title = (string)xitem.Attribute("title") ?? "",
Text = (string)xitem.Attribute("text") ?? "",
Type = (string)xitem.Attribute("type") ?? "",
xmlUrl = (string)xitem.Attribute("xmlUrl") ?? "",
htmlUrl = (string)xitem.Attribute("htmlUrl") ?? ""
};
AddChildElements(xitem, myRootOutline);
_list.Add(myRootOutline);
}
return _list;
}
private void AddChildElements(XElement xNode, OutLine ol)
{
if (xNode == null) return;
var xc = xNode.Elements("outline");
// 递归,添加子节点
foreach (XElement xe in xc)
{
OutLine outline = new OutLine()
{
Title = xe.Attribute("title").Value,
Text = xe.Attribute("text").Value,
Type = xe.Attribute("type").Value,
xmlUrl = xe.Attribute("xmlUrl").Value,
htmlUrl = xe.Attribute("htmlUrl").Value
};
ol.ChildrenOutline.Add(outline);
AddChildElements(xe, outline);
}
}
}


 

OK,简单的类库写好了,程序集名称为SinaRssAPIs_CS,然后,我们建一个程序来测试一下。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SinaRssAPIs_CS;
namespace NewsApiTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.WindowState = FormWindowState.Maximized;
this.Text = "新浪RSS类库示例程序";
this.treeView1.AfterSelect += new TreeViewEventHandler(treeView1_AfterSelect);
this.dataGridView1.AutoGenerateColumns = false; //不自动创建列
//添加列
DataGridViewTextBoxColumn colTitle = new DataGridViewTextBoxColumn();
colTitle.HeaderText = "新闻标题";
colTitle.DataPropertyName = "Title";
this.dataGridView1.Columns.Add(colTitle);
DataGridViewTextBoxColumn colDesc = new DataGridViewTextBoxColumn();
colDesc.HeaderText = "描述";
colDesc.DataPropertyName = "Description";
colDesc.Width = 280;
this.dataGridView1.Columns.Add(colDesc);
DataGridViewTextBoxColumn colDate = new DataGridViewTextBoxColumn();
colDate.DefaultCellStyle.Format = "yyyy-MM-dd";
colDate.HeaderText = "发布日期";
colDate.DataPropertyName = "PubDate";
this.dataGridView1.Columns.Add(colDate);
DataGridViewTextBoxColumn colAuthor = new DataGridViewTextBoxColumn();
colAuthor.HeaderText = "发布者";
colAuthor.DataPropertyName = "Author";
this.dataGridView1.Columns.Add(colAuthor);
DataGridViewTextBoxColumn colLink = new DataGridViewTextBoxColumn();
colLink.DataPropertyName = "Link";
colLink.Name = "link";
colLink.Visible = false;
this.dataGridView1.Columns.Add(colLink);
this.dataGridView1.SelectionChanged += new EventHandler(dataGridView1_SelectionChanged);
}
void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (this.dataGridView1.CurrentRow == null) return;
string link = this.dataGridView1.CurrentRow.Cells["link"].Value.ToString();
this.webBrowser1.Navigate(link);
}
void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node.Tag == null) return;
string xml = e.Node.Tag.ToString();
List<NewsItem> items = null;
NewsManager mg = new NewsManager();
items = mg.GetNewsItemList(xml);
this.dataGridView1.DataSource = items;
}
private void Form1_Load(object sender, EventArgs e)
{
OutlineManager omg = new OutlineManager();
List<OutLine> cnList = omg.GetCannels(@"http://rss.sina.com.cn/sina_all_opml.xml");
this.treeView1.BeginUpdate();
this.treeView1.Nodes.Clear();
//根节点
foreach (OutLine  root in cnList)
{
TreeNode tnRoot = new TreeNode();
tnRoot.Text = root.Title.Split('-')[0];
AddNodes(root, tnRoot);
this.treeView1.Nodes.Add(tnRoot);
}
this.treeView1.EndUpdate();
}
private void AddNodes(OutLine ol, TreeNode nd)
{
foreach (OutLine oits in ol.ChildrenOutline)
{
TreeNode tn = new TreeNode();
tn.Text = oits.Title;
tn.Tag = oits.xmlUrl;
AddNodes(oits, tn);
nd.Nodes.Add(tn);
}
}
}
}


大致的运行效果如下:

 

现在,我说一下技术要点,不多,就一个,对,就是LinQ To XML。

这篇关于今天写了一个简单的新浪新闻RSS操作类库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827897

相关文章

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷