📄 rssdatasource.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Threading;
namespace PtymRss
{
public class RssDataSource
{
private string url;
private bool isload=false;
private bool loadcancel;
public Rss_Rss Rss=new Rss_Rss();
//防止有的rss不规范,channel的开始深度不对
private int channelbegindepth=1;
private XmlDocument rssdocument=new XmlDocument();
public XmlDocument RssDocument
{
get { return rssdocument; }
set { rssdocument = value; }
}
public RssDataSource()
{
}
public RssDataSource(string _url)
{
url = _url;
}
/// <summary>
/// 读取xml物理地址
/// </summary>
/// <param name="filepath"></param>
//public RssDataSource(string filepath)
//{
//}
/// <summary>
/// 读取xml文档;
/// </summary>
/// <param name="xmldocument"></param>
public RssDataSource(XmlDocument xmldocument)
{
}
public bool Isload
{
get
{
return isload;
}
}
public bool Loadcancel
{
get
{
return loadcancel;
}
set
{
loadcancel = value;
}
}
public string Url
{
get
{
return url;
}
set
{
url = value;
}
}
public void Load()
{
//object x = new object();
lock ((object)isload)
{
isload = true;
try
{
Thread Td = new Thread(new ThreadStart(LoadRssSource));
Td.Start();
}
catch
{
isload = false;
}
// //LoadRssSource();
}
}
private void LoadRssSource()
{
XmlTextReader reader=new XmlTextReader(url);
while (reader.Read())
{
if (reader.NodeType != XmlNodeType.Element) continue;
if (reader.Name.ToLower() == "channel")
{
PtymRss.Rss_Channel channel = new Rss_Channel();
channelbegindepth = reader.Depth;
while(reader.Read())
{
//System.Windows.Forms.MessageBox.Show(reader.Depth.ToString());
if (reader.NodeType == XmlNodeType.EndElement && reader.Name.ToLower() == "channel") { Rss.ChannelCollection.Add(channel); break; }
if (reader.NodeType != XmlNodeType.Element) continue;
string readername=reader.Name.ToLower();
reader.Read();
switch (readername)
{
//case "title":
// {
// if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Title = reader.Value; break;
// }
//case "link": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Link = reader.Value; break; }
//case "description": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Description = reader.Value; break; }
//case "language": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Language = reader.Value; break; }
//case "pubdate": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.PubDate = reader.Value; break; }
//case "lastbuilddate": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.LastBuildDate = reader.Value; break; }
//case "docs": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Docs = reader.Value; break; }
//case "generator": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Generator = reader.Value; break; }
//case "managingeditor": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.ManagingEditor = reader.Value; break; }
//case "webmaster": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.WebMaster = reader.Value; break; }
case "title":
{
if (reader.Depth != channelbegindepth + 2) { break; } channel.Title = loadnodetext("title", reader, channelbegindepth +2); break;
}
case "link": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Link = loadnodetext("link", reader, channelbegindepth +2); break; }
case "description": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Description = loadnodetext("description", reader, channelbegindepth +2); break; }
case "language": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Language = loadnodetext("language", reader, channelbegindepth +2); break; }
case "pubdate": { if (reader.Depth != channelbegindepth + 2) { break; } channel.PubDate = loadnodetext("pubdate", reader, channelbegindepth +2); break; }
case "lastbuilddate": { if (reader.Depth != channelbegindepth + 2) { break; } channel.LastBuildDate = loadnodetext("lastbuilddate", reader, channelbegindepth +2); break; }
case "docs": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Docs = loadnodetext("docs", reader, channelbegindepth +2); break; }
case "generator": { if (reader.Depth != channelbegindepth +2) { break; } channel.Generator = loadnodetext("generator", reader, channelbegindepth +2); break; }
case "managingeditor": { if (reader.Depth != channelbegindepth +2) { break; } channel.ManagingEditor = loadnodetext("managingeditor", reader, channelbegindepth +2); break; }
case "webmaster": { if (reader.Depth != channelbegindepth +2) { break; } channel.WebMaster = loadnodetext("webmaster", reader, channelbegindepth +2); break; }
case "item":
{
Rss_Item rssitem=new Rss_Item();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.EndElement && reader.Name.ToLower() == "item") { channel.ItemCollection.Add(rssitem); break; }
if (reader.NodeType != XmlNodeType.Element) { continue; }
string readername2 = reader.Name.ToLower();
reader.Read();
switch (readername2)
{
case "title": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Title = loadnodetext("title", reader, channelbegindepth + 3); break; }
case "link": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Link = loadnodetext("link", reader, channelbegindepth + 3); break; }
case "description": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Description = loadnodetext("description", reader, channelbegindepth + 3); break; }
case "pubdate": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Pubdate = loadnodetext("pubdate", reader, channelbegindepth + 3); break; }
case "guid": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Guid = loadnodetext("guid", reader, channelbegindepth + 3); break; }
default: break;
}
}
break;
}
default:
break;
}
}
}
}
isload = false;
}
private string loadnodetext(string nodename,XmlReader reader,int depth)
{
string returnvalue = "";
if (reader.NodeType == XmlNodeType.CDATA || reader.NodeType == XmlNodeType.Text)
{
returnvalue = reader.Value;
}
while (reader.Read())
{
//如果已经为结束结点,就退出
if (reader.NodeType==XmlNodeType.EndElement && reader.Name.ToLower()==nodename)
{
return returnvalue;
}
//防止还有下一层要读取
if (reader.Depth != depth) continue;
//赋值
if (reader.NodeType==XmlNodeType.CDATA || reader.NodeType==XmlNodeType.Text)
{
returnvalue= reader.Value;
}
}
return returnvalue;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -