Sitemap-Dateien sind gewöhnliche Textdateien, die sich der Extensible Markup Language bedienen. Suchmaschinen benutzen sie für das Durchsuchen von Webseiten. Normalerweise wird diese Datei in der Webseite gespeichert und veröffentlicht.
Ich habe viel dynamischen Inhalt auf der Webseite und möchte diese Information den Suchmaschinen zur Verfügung stellen.
Die Lösung besteht aus 3 Teilen. Teil 1 ist die Sitemap Klasse siehe unten.
Teil 2 ist der Aufruf in einen Dateihandler:
public void ProcessRequest(HttpContext context)
{
DateTime lastChange = (DateTime)context.Application["ApplicationStart"];
string url = "http://www.xxl-pizza.de/";
SiteMapXml smx = new SiteMapXml();
smx.AddUrl(url + "anmeldung.aspx", lastChange, "weekly", "1.0");
smx.AddUrl(url + "linkpartneranmeldung.aspx", lastChange, "weekly", "1.0");
smx.AddUrl(url + "sitemap.aspx", lastChange, "weekly", "0.5");
smx.AddUrl(url + "suche.aspx", lastChange, "weekly", "0.5");
smx.AddUrl(url + "kontakt.aspx", lastChange, "weekly", "0.5");
smx.AddUrl(url + "abg.aspx", lastChange, "weekly", "0.5");
smx.AddUrl(url + "index.aspx", lastChange, "weekly", "0.5");
foreach (Pizzeria user in Pizzeria.GetList())
{
string tempUrl = "shop2info" + user.Id.ToString() + ".aspx";
smx.AddUrl(url+tempUrl, lastChange, "weekly", "0.5");
}
smx.AddUrl(url + "linkpartner1.aspx", lastChange, "weekly", "0.5");
smx.AddUrl(url + "linkpartner2.aspx", lastChange, "weekly", "0.5");
smx.AddUrl(url + "linkpartner3.aspx", lastChange, "weekly", "0.5");
smx.AddUrl(url + "linkpartner4.aspx", lastChange, "weekly", "0.5");
context.Response.ContentType = "text/xml";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.Write(smx.GetSiteMapString());
}
Und der 3. und letzte Teil ist der Eintrag für den Dateihandler in der web.config Datei.
<system.web>
...
<urlMappings enabled="true">
<add url="~/sitemap.xml" mappedUrl="~/common/handler/sitemapHandler.ashx"/>
</urlMappings>
</system.web>
Die sitemap Datei wird von allen Suchmaschinen akzeptiert. Wenn Ihr eine sitemap-Datei einbaut, dann vergesst nicht die robots.txt auf der Seite.
Und hier ist das Ergebnis diesen Snippets: http://www.xxl-pizza.de/sitemap.xml
public class SiteMapXml
{
private XmlDocument sitemapDoc = new XmlDocument();
string namespaceuri = "http://www.sitemaps.org/schemas/sitemap/0.9";
public SiteMapXml()
{
XmlNode urlsetNode = sitemapDoc.SelectSingleNode("urlset");
XmlNode root = sitemapDoc.CreateNode(XmlNodeType.Element, "urlset", namespaceuri);
sitemapDoc.AppendChild(root);
XmlDeclaration xmldecl;
xmldecl = sitemapDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
sitemapDoc.InsertBefore(xmldecl, sitemapDoc.DocumentElement);
}
public void AddUrl(string location, DateTime lastModified, string changeFreq, string priority)
{
XmlNode newNodeUrl = sitemapDoc.CreateNode(XmlNodeType.Element, "url", namespaceuri);
// location
XmlNode locationNode = sitemapDoc.CreateElement("loc", namespaceuri);
locationNode.InnerText = location;
newNodeUrl.AppendChild(locationNode);
// optional - lastmodified node - JJJJ-MM-TT
if (lastModified != null)
{
XmlNode lastmodifiedNode = sitemapDoc.CreateElement("lastmod", namespaceuri);
lastmodifiedNode.InnerText = lastModified.ToString("yyyy-MM-dd");
newNodeUrl.AppendChild(lastmodifiedNode);
}
//optional changefreq node
if (!String.IsNullOrEmpty(changeFreq))
{
XmlNode changefreqNode = sitemapDoc.CreateElement("changefreq", namespaceuri);
changefreqNode.InnerText = changeFreq;
newNodeUrl.AppendChild(changefreqNode);
}
// optional priority
if (!String.IsNullOrEmpty(priority))
{
XmlNode priorityNode = sitemapDoc.CreateElement("priority", namespaceuri);
priorityNode.InnerText = priority;
newNodeUrl.AppendChild(priorityNode);
}
sitemapDoc.DocumentElement.AppendChild(newNodeUrl);
}
public string GetSiteMapString()
{
StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);
sitemapDoc.WriteTo(xmlTextWriter);
return stringWriter.ToString();
}
}