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

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

目录
相关文章
|
1月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
12天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
31 5
|
20天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
70 13
|
1月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
51 7
|
1月前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
1月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
28天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
28天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
1月前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
|
2月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
44 1