Dynamic Sitemap with ASP.Net MVC (incl. geo)
Here is how I generate sitemaps using the XDocument API and a ContentResult. The entries are events that come out of the EventRepository
, please substitute as needed. Note that it would be vastly more elegant to use ActionLinks in some way. Note also that the first entry is a link to a Google Earth KMZ file (more here).
[OutputCache(Duration = 12 * 3600, VaryByParam = "*")] public ContentResult Sitemap() { string smdatetimeformat = "yyyy-MM-dd"; var erep = new EventRepository(); var events = (from e in erep.GetGeocodedEvents() where e.IncidentTime.HasValue select new {e.Title, e.PermId, e.IncidentTime}).ToList(); XNamespace sm = "http://www.sitemaps.org/schemas/sitemap/0.9"; XNamespace geo = "http://www.google.com/geo/schemas/sitemap/1.0"; XDocument doc = new XDocument( new XElement(sm + "urlset", new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"), new XAttribute(XNamespace.Xmlns + "geo", "http://www.google.com/geo/schemas/sitemap/1.0"), new XElement(sm + "url", new XElement(sm + "loc", "http://krimikort.ekstrabladet.dk/gearth.kmz"), new XElement(sm + "lastmod", DateTime.Now.ToString(smdatetimeformat)), new XElement(sm + "changefreq", "daily"), new XElement(sm + "priority", "1.0"), new XElement(geo + "geo", new XElement(geo + "format", "kmz") ) ) , events.Select(e => new XElement(sm + "url", new XElement(sm + "loc", EventExtensions.AbsUrl(e.Title, e.PermId)), new XElement(sm + "lastmod", e.IncidentTime.Value.ToString(smdatetimeformat)), new XElement(sm + "changefreq", "monthly"), new XElement(sm + "priority", "0.5") ) ) ) ); return Content(doc.ToString(), "text/xml"); }