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

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

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

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

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在