// public void ReLoadTree() { treeView1.Nodes.Clear(); //转换成实体类,把数据放在Tag中这样会方便些。 List<NavUrl> NavUrls = new List<NavUrl>(); var q = from p in mf.DS.NavUrl.AsEnumerable() select p; foreach (YQDataSet.NavUrlRow kind in q) { NavUrl nu = new NavUrl(); nu.ID = (int)kind.ID; nu.Name = kind.Name; nu.Nav_Domain = kind.Nav_Domain; nu.PID = (int)kind.PID; nu.Code = kind.Code; nu.Level = (int)kind.level; nu.Leaf = kind.Leaf; nu.Link = kind.Link; nu.Image = (int)kind.Image; nu.ItemCount = (int)kind.ItemCount; nu.NoReadCount = (int)kind.NoReadCount; NavUrls.Add(nu); } List<TreeNode> LT = GetTreeNodes(NavUrls); foreach (TreeNode tn in LT) { treeView1.Nodes.Add(tn); } }
//子层的递归 private void FindChildNode(TreeNode tnParent, NavUrl u, List<NavUrl> NavUrls) { foreach (NavUrl n in NavUrls) { if (n.PID == u.ID) { TreeNode tn = new TreeNode(); tn.Text = n.Name; tn.ImageIndex = tn.SelectedImageIndex = n.Image; tn.Tag = n; //2、递归子层; FindChildNode(tn, n, NavUrls); tnParent.Nodes.Add(tn); } } }
public static IHtmlString ActiveIfCurrent(this WebViewPage page, NavUrl navUrl) { var request = page.Request; string areaName = (string)request.RequestContext.RouteData.DataTokens["area"] ?? ""; string controllerName = (string)request.RequestContext.RouteData.Values["controller"] ?? ""; string actionName = (string)request.RequestContext.RouteData.Values["action"] ?? ""; var isTypeOk = true; if (navUrl.Type != null && navUrl.Type.Trim().Length > 0) { string type = request.Params[NavUrl.TypeParam] ?? ""; isTypeOk = navUrl.Type == type; } if (navUrl.Area == areaName && navUrl.Controller == controllerName && navUrl.Action == actionName && isTypeOk) { return(page.Html.Raw("class=\"active\"")); } return(page.Html.Raw("")); }
public static string GenerateUrl(this WebViewPage page, NavUrl navUrl) { return(page.Url.Action(navUrl.Action, navUrl.Controller, navUrl.RouteValues)); }
//增加子级节点,该新子级节点的数据 private void ShowSubJ(NavUrl nu) { /* * 需要做的: * 1、层级+1,不大于3. * 2、PID等于自己IDave * 3、Level〈3为F,否则为T * 4、计算Code值 * * 上面已经禁了是层级为3的项。所以只能判断为2和4项了。 */ txtFatherID.Text = nu.ID.ToString(); nudLevel.Value = nu.Level + 1; //计算Code的值 var qcode = from p in mf.DS.NavUrl.AsEnumerable() where p.Code.StartsWith(nu.Code) && p.level == nu.Level + 1 select p; List<int> num = new List<int>(); foreach (var item in qcode) { num.Add(Int32.Parse(item.Code)); } if (num.Count == 0)//没有记录时。 { txtThisCode.Text = nu.Code + "01"; } else { if (num.Max() < 9)//小于9的,只有一位; { txtThisCode.Text = nu.Code + "0" + (num.Max() + 1).ToString(); } else { txtThisCode.Text = (num.Max() + 1).ToString(); } } switch (nu.Code.Length) { case 2://此处节点为2级的 txtLeaf.Text = nu.Leaf; txtDomain.Enabled = false; txtThisUrl.Enabled = false; break; case 4://此处节点为3级的,即信RSS地址的 txtLeaf.Text = "T"; txtDomain.Enabled = true; txtThisUrl.Enabled = true; break; case 6: //此处为不能增加子节点了。否则会很多层级。 break; default: break; } }
//增加同级节点,新节点的数据 private void ShowSameJ(NavUrl nu) { lvImageList.Items[nu.Image].Selected = true; foreach (ListViewItem item in lvImageList.Items) { if (item.Selected == true) { item.BackColor = Color.Blue; } else { item.BackColor = Color.White; } } //以下四种需要计算 txtFatherID.Text = nu.PID.ToString(); nudLevel.Value = (int)nu.Level; txtLeaf.Text = nu.Leaf; //需要计算 默认为同级节点 txtThisCode.Text = ShowCode(nu.Code, nu.Level); }
//单选按键变化时 private void radioButton_Click(object sender, EventArgs e) { int id = Int32.Parse(labJID.Text); YQDataSet.NavUrlRow nur = mf.DS.NavUrl.FindByID(id); NavUrl nu = new NavUrl(); nu.ID = nur.ID; nu.PID = nur.PID; nu.Code = nur.Code; nu.Level = nur.level; nu.Leaf = nur.Leaf; nu.Image = nur.Image; if (rabTJ.Checked == true)//增加同级 { ShowSameJ(nu);//显示同级 } else //增加子级节点 主是新大分类中的子分类 { ShowSubJ(nu); } }
private void Nomal_GetRssXml(NavUrl navurl) { try { //加载RSS新闻数据 XElement rssData = XElement.Load(navurl.Link); var itemQuery = from item in rssData.Descendants(XName.Get("item")) select new { Title = item.Element(XName.Get("title")).Value.Trim(), Link = item.Element(XName.Get("link")).Value, PubDate = item.Element(XName.Get("pubDate")).Value }; foreach (var result in itemQuery) { //为百度源CDATA标签设置过滤 //通过Link查找DataSet中是否有相同的网址 //查询RssItem表中,与这个频道相同的项中,是否有相同的网址,如果有不采集 加上网站去重,用title int f = (from p in mf.DS.RssItem.AsEnumerable() where (p.Link == result.Link || p.Title == result.Title) select p).ToList().Count; /*在DataSet中设置了新境时自动增加ID值,AtuoIncremnet 为true; *设置Link列为Unique唯一索引。通过该值查找对应的ItemRssm. */ if (f == 0) { //这里过渡日期 if (Convert.ToDateTime(result.PubDate) > (DateTime.Now.AddDays(-7))) { //先在DS中加入一行, mf.DS.RssItem.AddRssItemRow(navurl.Name, navurl.Code, result.Title.Trim(), result.Link, result.PubDate, "F", ""); //既然是新增的找ID困难,那么我们就只专心做上面的一件事,其它的:比如显示呀,多线程采集内容呀,下一步再说。现在测试 } } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
//子层的递归 private void FindChildNode(TreeNode tnParent, NavUrl u, List<NavUrl> NavUrls) { foreach (NavUrl n in NavUrls) { if (n.PID == u.ID) { TreeNode tn = new TreeNode(); //实现了信息条目的显示。 tn.Text = n.Name + "(" + n.NoReadCount.ToString() + "/" + n.ItemCount.ToString() + ")"; tn.ImageIndex = tn.SelectedImageIndex = n.Image; tn.Tag = n; //2、递归子层; FindChildNode(tn, n, NavUrls); tnParent.Nodes.Add(tn); } } }
private void DownRss_XinHa(NavUrl navurl) { try { //加载RSS新闻数据 XElement rssData = XElement.Load(navurl.Link); //取出新闻标题,转成RssItem对象,并暂存到列表控件中 //看来只能用正规截取了! //<link>http://news.xinhuanet.com/shuhua/2013-11/16/c_125712954.htm</link> //Sat,16-Nov-2013 11:33:12 GMT //<description> Regex regex = new Regex(@"(?<=<\/link>)(.*?)(?=<description>)"); //想到的办法:一是通过xelement对象,正规取得;二是在源码中加入pubDate标签。 //取出新闻标题,转成RssItem对象,并暂存到列表控件中 #region test //var i = rssData.Descendants(XName.Get("item")).First(); //MessageBox.Show(i.ToString());//保留了xelement格式。 //去除标题的a标签。 Regex regTitle = new Regex(@"</?.+?>"); //去除连接中的双引号 //string s="\"http://news.xinhuanet.com/edu/2013-10/11/c_125515383.htm\""; //MessageBox.Show(s.Replace("\"", "")); #endregion var itemQuery = from item in rssData.Descendants(XName.Get("item")) select new { Title = regTitle.Replace(item.Element(XName.Get("title")).Value.Trim(), ""), Link = item.Element(XName.Get("link")).Value.Replace("\"", ""), PubDate = regex.Match(item.ToString()).ToString() //PubDate = item.Element(XName.Get("pubDate")).Value }; //用于标记本次新采集了多少条。 foreach (var result in itemQuery) { //通过Link查找DataSet中是否有相同的网址 //查询RssItem表中,与这个频道相同的项中,是否有相同的网址,如果有不采集 加上网站去重,用title int f = (from p in mf.DS.RssItem.AsEnumerable() where (p.Link == result.Link || p.Title == result.Title) select p).ToList().Count; if (f == 0) { //方法二:在DataSet中添加行,然后一次提交到库 mf.DS.RssItem.AddRssItemRow(navurl.Name, navurl.Code, result.Title.Trim(), result.Link, result.PubDate, "F", ""); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void DownRss_Sina(NavUrl navurl) { //加载RSS新闻数据 XElement rssData = XElement.Load(navurl.Link); Regex regex = new Regex(@"(?<=[=]).*"); //http://go.rss.sina.com.cn/redirect.php?url=http://tech.sina.com.cn/it/2013-11-16/09198919884.shtml //取出新闻标题,转成RssItem对象,并暂存到列表控件中 var itemQuery = from item in rssData.Descendants(XName.Get("item")) select new { Title = item.Element(XName.Get("title")).Value.Trim(), Link = regex.Match(item.Element(XName.Get("link")).Value).ToString(), PubDate = item.Element(XName.Get("pubDate")).Value }; foreach (var result in itemQuery) { //查询RssItem表中,与这个频道相同的项中,是否有相同的网址,如果有不采集 加上网站去重,用title int f = (from p in mf.DS.RssItem.AsEnumerable() where (p.Link == result.Link || p.Title == result.Title) select p).ToList().Count; if (f == 0) { //这里过滤日期 if (Convert.ToDateTime(result.PubDate) > (DateTime.Now.AddDays(-7))) { mf.DS.RssItem.AddRssItemRow(navurl.Name, navurl.Code, result.Title.Trim(), result.Link, result.PubDate, "F", ""); } } } }
private void DownLoadRssItem(NavUrl navurl) { /* * 采集分有RSS采集,等8类。Rss采集只是其中一类。 * Rss采集中《新华网》采规则又有不同,需要单独取出。 * 标记一下,是不是有新的项采了进来。如果没有就不用统计和更新。!!! * 采集到的东西,如果时间太长了。大于1周前的内容,干脆就过虑掉。!!! */ switch (navurl.Code.Substring(0, 2))//取出大项分类01-08, { case "01"://此项为Rss采集 switch (navurl.Code.Substring(0, 4))//判断特殊规则,如新华网 { //case "0102"://新浪网 // DownRss_Sina(navurl); // break; case "0108"://新闻网 DownRss_XinHa(navurl); break; default://正常内容rss2.0 //百度新闻订阅中包含CDATA,不管是哪种DOM解析,cdata都是透明的,也就是完全可以当做cdata不存在来解析, Nomal_GetRssXml(navurl); //DownloadRSS(navurl); break; } break; case "02"://网站新闻 break; case "03"://论坛 break; case "04"://博客 break; case "05"://微博 break; case "06"://微信 break; case "07"://客户端 break; case "08"://外网 break; } mf.SaveRssItemToDB(mf.DS.RssItem); //更新总数 不要在这里作了。容易出错 }