如何用C#编程创建XML站点地图

11

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

有人可以告诉我如何使用我的网站基本URL访问Web服务器的根目录,并将所有页面列表获取到一个字符串列表中吗?


1
你尝试使用Directory.GetFiles()了吗? - Amiram Korach
你必须展示一些努力,一些你所做的工作。有一些函数可以找到文件,还有一些类可以制作XML文件。而且互联网上也有很多例子。所以开始动手吧,如果你在一个星期的开发中遇到了一些小问题,再回来寻求帮助。 - Aristos
我已经尝试了很多次,但无法从服务器检索页面。 - Soumita Parui
请查看以下链接:http://www.codeproject.com/Articles/18508/Simple-Sitemaps-in-ASP-NET http://www.codeproject.com/Articles/16860/Building-a-dynamic-SiteMap-in-ASP-NET-2-0-for-a-la http://stackoverflow.com/questions/3469140/web-sitemap-generation - Aristos
4个回答

14

轻松来到

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的摘录 :)


1
你能否编辑你的答案,加入更多内容而不只是一个链接?仅有链接的答案通常在 Stack Overflow 上不被看好,因为链接可能在未来某个时候失效,使得你的答案变得毫无价值。 - Daniel Mann
1
哇.. XML地狱.. 还记得DLL地狱吗?看到这个都让人痛苦...但我们能做什么呢? - Piotr Kula

10

你的库非常好。但是我想在创建新页面时自动更新网站地图。我们该怎么做? - It's a trap
你可以创建一个命令行实用程序,并将其集成到你的构建/部署过程中。 - A G
哇,没有对原作者进行归属...http://blog.mikecouturier.com/2011/07/seo-tip-dynamic-google-xml-sitemaps.html - The_Butcher
@The_Butcher 我的库是一个扩展版本,具有一些新功能。你可以进行比较和检查。 - A G
@AseemGautam 你好,我尝试使用这个库,但是无法通过提供URL生成网站地图。它只生成空文件。我的代码如下:Sitemap sitemap = new Sitemap(); sitemap.Add(new SitemapLocation { ChangeFrequency = SitemapLocation.eChangeFrequency.monthly, Url = "https://modernpathshala.com", }); sitemap.WriteSitemapToFile(@"d://sitemap.xml"); - Ashish Shukla

4
您可以查看此 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 完成了! :)

1
如果您的网站页面彼此链接并且普通用户可以浏览所有页面(在页面内容中具有必要的链接),则可以递归地创建网站网页列表并将其放入XML文件中(遵循sitemap协议的标准)。来自工作应用程序的URL列表生成器代码片段:
...
   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);
...

普通 文本到XML解析方法

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);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接