asp.net core3.1 c# 生成三种sitemap

简介: asp.net core3.1 c# 生成三种sitemap

asp.net core3.1 c# 生成三种sitemap,今天发个汇总的。代码还未重构,哪位大咖自己重构一下吧。先看看成果物截图:

统一放到网站根目录就行。 asp.net core3.1的根目录是wwwroot下,接下来我会升级项目到NET6.

运行的成果物:

网站地图三种格式生成代码:

#region CreateSiteMap
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [Route("/system/ajaxCreateSiteMap")]
        public JsonResult CreateSiteMap()
        {
            try
            {
                //XML
                string currentXmlFileName = "sitemap.xml";
                string sitemapPath = _Environment.WebRootPath;
                string sitemapFileFullNamePath = string.Format(sitemapPath + "/{0}", currentXmlFileName);
                //TXT
                string sitemaptxtname = "sitemap.txt";
                string sitemapTxTFileFullNamePath = string.Format(sitemapPath + "/{0}", sitemaptxtname);
                FileStream fs = new FileStream(sitemapTxTFileFullNamePath, FileMode.Create, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
                sw.BaseStream.Seek(0, SeekOrigin.End);
                sw.WriteLine("https://www.yadinghao.com");
                //html
                string sitemaphtmlname = "sitemap.html";
                string sitemapHtmlFileFullNamePath = string.Format(sitemapPath + "/{0}", sitemaphtmlname);
                FileStream htmlfs = new FileStream(sitemapHtmlFileFullNamePath, FileMode.Create, FileAccess.Write);
                StreamWriter htmlsw = new StreamWriter(htmlfs, System.Text.Encoding.UTF8);
                htmlsw.BaseStream.Seek(0, SeekOrigin.End);
                StringBuilder sb= new StringBuilder();
                sb.AppendLine("<!DOCTYPE html>");
                sb.AppendLine("<html lang='en'>");
                sb.AppendLine("<head>");
                sb.AppendLine("<meta charset='UTF-8'>");
                sb.AppendLine("<meta name='viewport' content='width=device-width, initial-scale=1.0'>");
                sb.AppendLine("<title>sitemap</title>");
                sb.AppendLine("</head>");
                sb.AppendLine("<body>");
                sb.AppendLine("<style>a{color:rgb(0, 0, 238);font-size:13px;}</style>");
                sb.AppendLine("<ol><li><a href='https://www.yadinghao.com'>亚丁号</a></li>");
                var articleList = new ArticleAccess().FindArticleListForSitemap();  //获取需要生成sitemmap的数据
                XmlDocument xmlDoc = new XmlDocument();
                //加入XML的声明段落:<?xmlversion="1.0" encoding="utf-8"?>
                XmlDeclaration xmldecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
                xmlDoc.AppendChild(xmldecl);
                XmlElement xe = xmlDoc.CreateElement("urlset");//创建一个urlset根元素
                xmlDoc.AppendChild(xe);
                XmlNode root = xmlDoc.SelectSingleNode("urlset");//查找<urlset>
                XmlElement xmle = xmlDoc.CreateElement("url"); //创建一个<api>节点 
                XmlElement xmle1 = xmlDoc.CreateElement("loc");
                xmle1.InnerText = "https://www.yadinghao.com";//此处拼接动态地址
                xmle.AppendChild(xmle1);
                XmlElement xmle2 = xmlDoc.CreateElement("lastmod");
                xmle2.InnerText = Tools.GetDate();
                xmle.AppendChild(xmle2);
                XmlElement xmle3 = xmlDoc.CreateElement("changefreq");
                xmle3.InnerText = "always";
                xmle.AppendChild(xmle3);
                XmlElement xmle4 = xmlDoc.CreateElement("priority");
                xmle4.InnerText = "1";
                xmle.AppendChild(xmle4);
                xe.AppendChild(xmle);
                foreach (var item in articleList)
                {
                    var spriderUrl = string.Format("https://www.yadinghao.com/article/details/{0}.html", item.ARTICLE_CODE);
                    sw.WriteLine(spriderUrl);
                    sb.AppendLine("<li><a href='"+ spriderUrl + "'>"+ item.ARTICLE_TITLE+ "</a></li>");
                    XmlElement xe1 = xmlDoc.CreateElement("url"); //创建一个<api>节点 
                    XmlElement xesub1 = xmlDoc.CreateElement("loc");
                    xesub1.InnerText = spriderUrl;//此处拼接动态地址
                    xe1.AppendChild(xesub1);
                    XmlElement xesub2 = xmlDoc.CreateElement("lastmod");
                    xesub2.InnerText = item.CREATEDATE.ToString("yyyy-MM-dd");
                    xe1.AppendChild(xesub2);
                    XmlElement xesub3 = xmlDoc.CreateElement("changefreq");     //是用来告诉搜索引擎网站更新的周期,描述的单词:“always”(经常) 、“hourly”(每时)、“daily”(每天)、“weekly”(每周)、“monthly”(每月)、“yearly”(每年)。像首页就可以用“always”;对于很久前的链接或不再更新内容的链接就可以使用“yearly”。
                    xesub3.InnerText = "yearly";
                    xe1.AppendChild(xesub3);
                    XmlElement xesub4 = xmlDoc.CreateElement("priority");
                    xesub4.InnerText = "0.8";
                    xe1.AppendChild(xesub4);
                    root.AppendChild(xe1);
                }
                xmlDoc.Save(sitemapFileFullNamePath);    //此处放xml文件的保存地址
                sb.AppendLine("</ol>");
                sb.AppendLine("</body>");
                sb.AppendLine("</html>");
                htmlsw.WriteLine(sb.ToString());
                htmlsw.Flush();
                htmlsw.Close();
                sw.Flush();
                sw.Close();
                return JsonResultRight();
            }
            catch (Exception ex)
            {
                _Logger.LogError("ajaxCreateSiteMapXml生成数据失败:" + ex.Message);
                return JsonResultError("ajaxCreateSiteMapXml生成数据失败:" + ex.Message);
            }
        }
        #endregion

 

页面加载各种地图格式:

public static int readFileLines(string path)  //这里的参数是txt所在路径
        {
            int lines = 0;  //用来统计txt行数
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamReader sr = new StreamReader(fs);
            while (sr.ReadLine() != null)
            {
                lines++;
            }
            fs.Close();
            sr.Close();
            return lines;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="path"></param>
        /// <param name="tag"></param>
        /// <returns></returns>
        public static int readHtmlTagLines(string path,string tag)  
        {
            int lines = 0;  //用来统计tag行数
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamReader sr = new StreamReader(fs);
            StringBuilder sb   = new StringBuilder();
            string ss = "";
            ss = sr.ReadToEnd();
            string[] strings= ss.Split(tag);
            lines = strings.Length;
            //while (sr.ReadLine() != null)
            //{
            //    string lineMessage = sr.ReadLine();
            //    if (lineMessage == null)
            //    {
            //        continue;
            //    }
            //    else
            //    {
            //        sb.Append(lineMessage);
            //    }
            //    //if (lineMessage.Contains(tag))
            //    //{
            //    //    lines++;
            //    //}
            //}
            //string html= sb.ToString();
            IHtmlDocument source = new JumonyParser().LoadDocument(path, System.Text.Encoding.GetEncoding("utf-8"));
            string html = wc.DownloadString("https://www.baidu.com/");
            以正则表达式的形式匹配到字符串网页中想要的数据
            //MatchCollection matches = Regex.Matches(html, "<a.*>(.*)</a>");
            依次取得匹配到的数据
            //foreach (Match item in matches)
            //{
            //    string hhhhh = item.Groups[1].Value;
            //    Console.WriteLine(hhhhh);
            //}
            fs.Close();
            sr.Close();
            return lines;
        }
        [Route("/system/ajaxLoadSiteMaps")]
        public JsonResult LoadSiteMaps()
        {
            try
            {
                List<SiteMapEntity> resultList = new List<SiteMapEntity>();
                string filePath = _Environment.WebRootPath;
                //sitemap
                DirectoryInfo root = new DirectoryInfo(filePath);
                FileInfo[] files = root.GetFiles();
                int MB = 1024 * 1024;
                foreach (FileInfo file in files)
                {
                    string extension = Path.GetExtension(file.FullName);//扩展名
                    if (file.Name.Contains("sitemap") & extension == ".html")
                    {
                        string fileSize = Math.Round(file.Length / (float)MB, 2).ToString();
                        SiteMapEntity model = new SiteMapEntity();
                        model.SITEMAP_ID = Tools.GetGUID();
                        model.SITEMAP_MD5 = Tools.MD5String(file.FullName);
                        model.SITEMAP_NAME = file.Name;
                        model.SITEMAP_SIZE = fileSize + "MB";
                        int fileTxTNumber = readHtmlTagLines(file.FullName, "href");
                        model.SITEMAP_NUMBER = fileTxTNumber.ToString();
                        model.CREATEDATE = file.LastWriteTime;
                        using (StreamReader sr = new StreamReader(file.FullName, FileEncoding.GetType(file.FullName)))
                        {
                            string sTemp = string.Empty;
                            string sCurEncode = sr.CurrentEncoding.EncodingName;
                            model.SITEMAP_ENCODING = sCurEncode;
                        }
                        resultList.Add(model);
                    }
                    if (file.Name.Contains("sitemap") & extension == ".txt")
                    {
                        string fileSize = Math.Round(file.Length / (float)MB, 2).ToString();
                        SiteMapEntity model = new SiteMapEntity();
                        model.SITEMAP_ID = Tools.GetGUID();
                        model.SITEMAP_MD5 = Tools.MD5String(file.FullName);
                        model.SITEMAP_NAME = file.Name;
                        model.SITEMAP_SIZE = fileSize + "MB";
                        int fileTxTNumber = readFileLines(file.FullName);
                        model.SITEMAP_NUMBER = fileTxTNumber.ToString();
                        model.CREATEDATE = file.LastWriteTime;
                        using (StreamReader sr = new StreamReader(file.FullName, FileEncoding.GetType(file.FullName)))
                        {
                            string sTemp = string.Empty;
                            string sCurEncode = sr.CurrentEncoding.EncodingName;
                            model.SITEMAP_ENCODING = sCurEncode;
                        }
                        resultList.Add(model);
                    }
                    if (file.Name.Contains("sitemap") & extension == ".xml")
                    {
                        string fileSize = Math.Round(file.Length / (float)MB, 2).ToString();
                        SiteMapEntity model = new SiteMapEntity();
                        model.SITEMAP_ID = Tools.GetGUID();
                        model.SITEMAP_MD5 = Tools.MD5String(file.FullName);
                        model.SITEMAP_NAME = file.Name;
                        model.SITEMAP_SIZE = fileSize + "MB";
                        using (StreamReader sr = new StreamReader(file.FullName, FileEncoding.GetType(file.FullName)))
                        {
                            string sTemp = string.Empty;
                            string sCurEncode = sr.CurrentEncoding.EncodingName;
                            model.SITEMAP_ENCODING = sCurEncode;
                        }
                        int nodeCount = 0;
                        XmlDocument doc = new XmlDocument();
                        doc.Load(file.FullName);
                        //获得根节点
                        XmlNode rootNode = doc.DocumentElement;
                        //在根节点中寻找节点
                        foreach (XmlNode node in rootNode.ChildNodes)
                        {
                            //找到对应的节点
                            if (node.Name == "url")
                            {
                                nodeCount = nodeCount + 1;
                            }
                        }
                        model.SITEMAP_NUMBER = nodeCount.ToString();
                        model.CREATEDATE = file.LastWriteTime;
                        resultList.Add(model);
                    }
                }
                return ListToJsonString(resultList.Count, resultList);
            }
            catch (Exception ex)
            {
                _Logger.LogError("ajaxLoadSiteMaps加载数据失败:" + ex.Message);
                return JsonResultError("加载数据失败" + ex.Message);
            }
        }
        #endregion

加载的时候已经考虑地图文件分割的问题.

目录
相关文章
|
4月前
|
开发框架 JSON JavaScript
ASP.NET Core3.1实战教程---基于Jquery单文件上传
ASP.NET Core3.1实战教程---基于Jquery单文件上传
26 0
|
6月前
|
开发框架 .NET C#
ASP.Net c# 正则表达式 子表达式 group
ASP.Net c# 正则表达式 子表达式 group
36 0
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
65 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
101 5
|
4月前
|
开发框架 .NET Java
ASP.NET Core高级编程--C#基本特性(一)
本文章简略介绍C#的部分特性
|
9月前
|
SQL 开发框架 .NET
基于ASP.NET实现的排课系统(C#课程设计)
基于ASP.NET实现的排课系统(C#课程设计)
76 0
|
5月前
|
数据采集 开发框架 监控
C# ASP.NET 实验室 检验中心 医疗LIS源码
LIS系统整体流程 检验项目申请:医生通过HIS或者病历系统开具检验项目检验申请单(内容包括病人信息及检验项目),申请信息自动传到护士站。如果不和HIS和病历系统对接,可以通过LIS系统自身的检验申请模块,实现申请单电子化,申请信息自动传到护士站。
33 0
|
7月前
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
51 0
|
10月前
|
开发框架 人工智能 前端开发
Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用
Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用
192 0
|
10月前
|
开发框架 前端开发 JavaScript
C# ASP.NET Core开发学生信息管理系统(三)
C# ASP.NET Core开发学生信息管理系统(三)
131 0