【问题标题】:How to create XML sitemap programmatically in c#如何在 C# 中以编程方式创建 XML 站点地图
【发布时间】:2012-11-07 02:20:33
【问题描述】:

我正在建立一个网站。现在我想创建它的 xml 站点地图,如谷歌站点地图。但我想使用 C# 以编程方式创建它。

谁能告诉我如何使用我网站的基本 url 访问 web 服务器上的根目录,将所有页面列表放入一个字符串列表中?

【问题讨论】:

标签: c# asp.net xml-sitemap


【解决方案1】:

如果您的网站页面相互链接并且普通用户可以浏览所有页面(在页面内容中有必要的链接),则可以递归地创建网站网页列表并将其放入 xml 文件(遵守sitemap protocol的标准) 来自working app的url列表生成器的代码sn-p:

...
   new_urls.Add(BaseUrl);  //first url
   do
   {
      List hrefs=new List();
      foreach (var url in new_urls)
      {
         string text =await _loader.Get(url);
         if (string.IsNullOrEmpty(text)) continue;

         visited.Add(url);
         List meta=Parser.GetAHrefs(text).Distinct().ToList();  //getting list of links
         Parser.Normalize(Domain,url,ref meta);
         if (Exclude)  //option to exclude query from url
             meta = meta.Select(u => u.Contains('?') ? u.Split('?')[0] : u).ToList();
         hrefs.AddRange(meta);
         hrefs = hrefs.Distinct().ToList();
       }
       new_urls = hrefs.Except(visited).ToList();   //excluding visited pages
    }
    while (new_urls.Count != 0);
...

普通text to xml parsing method:

public void Save(string path)
        {
            string doc = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>";

            doc += OpenTag("urlset", "xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"");

            if (UseOpt)
            {
                foreach (var url in Urls)
                {
                    doc += OpenTag("url");
                    doc += Tag("loc", url);
                    doc += Tag("lastmod", LastMode);
                    doc += Tag("changefreq", Changefreq);
                    doc += Tag("priority", Priority);
                    doc += CloseTag("url");
                }
            }
            else
            {
                foreach(var url in Urls)
                {
                    doc += OpenTag("url");
                    doc += Tag("loc", url);
                    doc += CloseTag("url");
                }
            }

            doc += CloseTag("urlset");

            File.WriteAllText(path,doc);
        }

【讨论】:

    【解决方案2】:

    你可以看看这个 NuGet 包(支持 .Net 和 .Net Core) https://www.nuget.org/packages/xsitemap/

    class Program
    {
        static void Main(string[] args)
        {
            var sitemap = new Sitemap();
    
            sitemap.Add(new Url
            {
                ChangeFrequency = ChangeFrequency.Daily,
                Location = "http://www.example.com",
                Priority = 0.5,
                TimeStamp = DateTime.Now
            });
    
            sitemap.Add(CreateUrl("http://www.example.com/link1"));
            sitemap.Add(CreateUrl("http://www.example.com/link2"));
            sitemap.Add(CreateUrl("http://www.example.com/link3"));
            sitemap.Add(CreateUrl("http://www.example.com/link4"));
            sitemap.Add(CreateUrl("http://www.example.com/link5"));
    
    
            //Save sitemap structure to file
            sitemap.Save(@"d:\www\example.com\sitemap.xml");
    
            //Split a large list into pieces and store in a directory
            sitemap.SaveToDirectory(@"d:\www\example.com\sitemaps");
    
            //Get xml-content of file
            Console.Write(sitemap.ToXml());
    
            Console.ReadKey();
        }
    
        private static Url CreateUrl(string url)
        {
            return new Url
            {
                ChangeFrequency = ChangeFrequency.Daily,
                Location = url,
                Priority = 0.5,
                TimeStamp = DateTime.Now
            };
        }
    }
    

    原始项目可在此处获得 https://github.com/ernado-x/X.Web.Sitemap

    等等! :)

    【讨论】:

      【解决方案3】:

      我已经制作了这个库,它可以很容易地从一个类创建谷歌站点地图或列出一个 url。

      https://github.com/aseemgautam/google-sitemap

      【讨论】:

      • 你的图书馆很好。但是我想在创建新页面时自动更新站点地图。我们该怎么做?
      • 您可以创建一个命令行实用程序并将其集成到您的构建/部署过程中
      • 哇不是原作者的归属...blog.mikecouturier.com/2011/07/…
      • @The_Butcher 我的库是具有一些新功能的扩展版本。您可以比较和检查。
      • @AseemGautam 嗨,我尝试了这个库,但无法通过提供 URL 来生成站点地图。它正在生成空白文件。我的代码如下 Sitemap sitemap = new Sitemap(); sitemap.Add(new SitemapLocation { ChangeFrequency = SitemapLocation.eChangeFrequency.monthly, Url = "modernpathshala.com", }); sitemap.WriteSitemapToFile(@"d://sitemap.xml");
      【解决方案4】:

      放轻松

      private void GenerateXML()
          {
              try
              {
                  string fileName         = "sitemap.xml";
      
                  string DOMAIN           = "http://www.sohel-elite.com";
                  string LAST_MODIFY= String.Format("{0:yyyy-MM-dd}", DateTime.Now);
                  string CHANGE_FREQ      = "monthly";
                  string TOP_PRIORITY     = "0.5";
                  string MEDIUM_PRIORITY  = "0.8";
      
                  XNamespace ns    = "http://www.sitemaps.org/schemas/sitemap/0.9";
                  XNamespace xsiNs = "http://www.w3.org/2001/XMLSchema-instance";
      
                  //XDocument Start
                  XDocument xDoc = new XDocument(
                      new XDeclaration("1.0", "UTF-8", "no"),
                      new XElement(ns + "urlset",
                      new XAttribute(XNamespace.Xmlns + "xsi", xsiNs),
                      new XAttribute(xsiNs + "schemaLocation",
                          "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"),
                      new XElement(ns + "url",
      
                          //Root Element
                          new XElement(ns + "loc",        DOMAIN),
                          new XElement(ns + "lastmod",    LAST_MODIFY),
                          new XElement(ns + "changefreq", "weekly"),
                          new XElement(ns + "priority",   TOP_PRIORITY)),
      
                          //Level0 Menu
                          from level0 in GetParentCMSMenu()
                              select new XElement(ns + "url",
                                  new XElement(ns + "loc", String.Concat(DOMAIN, WebsiteHelpers.GetMenuRouteURL(Util.Parse<string>(level0.MENU_ALLIAS), Util.Parse<string>((level0.Level1 == null) ? string.Empty : level0.Level1), Util.Parse<int>(level0.APPLICATION_ID)))),
                                  new XElement(ns + "lastmod",    LAST_MODIFY),
                                  new XElement(ns + "changefreq", CHANGE_FREQ),
                                  new XElement(ns + "priority",   MEDIUM_PRIORITY)
                              ),
      
                          //Level1 Menu
                          from level0 in GetParentCMSMenu()
                             from level1 in GetLevel1Menu(Util.Parse<int>(level0.MENU_ID))
                                  select new XElement(ns + "url",
                                      new XElement(ns + "loc", String.Concat(DOMAIN, WebsiteHelpers.GetMenuRouteURL(Util.Parse<string>(level1.Level1), Util.Parse<string>((level1.MENU_ALLIAS == null) ? string.Empty : level1.MENU_ALLIAS), Util.Parse<int>(level1.APPLICATION_ID)))),
                                      new XElement(ns + "lastmod",    LAST_MODIFY),
                                      new XElement(ns + "changefreq", CHANGE_FREQ),
                                      new XElement(ns + "priority",   MEDIUM_PRIORITY)
                                  ),
      
                          //Level2 Menu
                          from level0 in GetParentCMSMenu()
                              from level1 in GetLevel1Menu(Util.Parse<int>(level0.MENU_ID))
                                  from level2 in GetLevel2Menu(Util.Parse<int>(level1.MENU_ID))
                                      select new
                                          XElement(ns + "url",
                                          new XElement(ns + "loc", String.Concat(DOMAIN, WebsiteHelpers.GetMenuRouteURL(Util.Parse<string>(level2.Menu), Util.Parse<string>(level2.Level1), Util.Parse<int>(level2.AppID), Util.Parse<string>(level2.Level2)))),
                                          new XElement(ns + "lastmod", LAST_MODIFY),
                                          new XElement(ns + "changefreq", CHANGE_FREQ),
                                          new XElement(ns + "priority", MEDIUM_PRIORITY)
                                      )
      
                  ));
                  //XDocument End
      
                  xDoc.Save(Server.MapPath("~/") + fileName);
      
                  this.MessageHolder.Visible = true;
                  this.MessageHolder.Attributes.Add("class", "success");
                  this.MessageHolder.InnerHtml = "Sitemap.xml created successfully";
      
              }
              catch (Exception ex)
              {
                  this.MessageHolder.Visible = true;
                  this.MessageHolder.Attributes.Add("class", "error");
                  this.MessageHolder.InnerHtml = Constants.ERROR_LONG_MESSAGE + "<br/>" + ex.ToString();
              }
          }
      

      是页面的摘录:) Page

      【讨论】:

      • 您可以编辑您的答案以包含更多内容,而不仅仅是一个链接吗? Stack Overflow 上通常不赞成仅链接的答案,因为链接可能会在未来某个时候失效,从而使您的答案一文不值。
      • 哇.. XML 地狱.. 还记得 DLL Hell 吗?甚至看到这个都很痛苦……但是我们能做些什么呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      相关资源
      最近更新 更多