ASP.NET MVC ile Dinamik Site Haritası Oluşturma

Sitemizi arama motorları belli aralıklarla tarar ve yeni eklenen içerikleri indexler. Veya siz bir site haritası oluşturursunuz ve bunu arama motoruna gösterirsiniz. Bunun için xml formatında bir site haritası oluşturmanız gerekmektedir. Ama burada bir sorun karşımıza çıkıyor. Sitemizin içeriği dinamik olduğu yani belli aralıklarla değiştiği için her seferinde manuel olarak yeni bir xml dosyası oluşturmamız gerekir. Bunun yerine bunu otomatik olarak gerçekleştirmemiz gerekiyor. Sitemizin içeriği değiştiğinde veritabanından yeni bilgileri çekip bunu xml formatında yazdırabiliriz. Aslında yapacağımız işlem çok basit. Veritabanından çektiğimiz bilgileri string builder ile xml formatında oluşturduktan sonra bunu ekrana yazdıracağız.

public static string SiteMapXML()
{
    mhmtyylcEntities _entity = new mhmtyylcEntities();

    StringBuilder strBuilder = new StringBuilder();

    strBuilder.AppendLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    strBuilder.AppendLine("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">");

    #region HomePage

    strBuilder.AppendLine("<url>");
    strBuilder.AppendLine("<loc>");

    //Ana sayfamızın linki sabit olduğundan kendimiz ekledik.
    string URL = String.Format("http://mhmtyylc.com");
    strBuilder.AppendLine(URL);
    strBuilder.AppendLine("</loc>");
    strBuilder.AppendLine("<changefreq>");
    strBuilder.AppendLine("always");
    strBuilder.AppendLine("</changefreq>");
    strBuilder.AppendLine("<priority>");
    strBuilder.AppendLine("1");
    strBuilder.AppendLine("</priority>");
    strBuilder.AppendLine("</url>");
    #endregion

    #region Categories

    //Veratabanından kategorileri getiriyoruz.
    var categories = _entity.Categories.ToList();

    //foreach ile kategoriler içinde dönüyoruz.
    foreach (var item in categories)
    {
        strBuilder.AppendLine("<url>");
        strBuilder.AppendLine("<loc>");
        string CatURL = item.URL;
        //burada gelen kategorinin linkini oluşturuyoruz.
        URL = "http://mhmtyylc.com/category/" + CatURL;
        strBuilder.AppendLine(URL);
        strBuilder.AppendLine("</loc>");
        strBuilder.AppendLine("<changefreq>");
        strBuilder.AppendLine("weekly");
        strBuilder.AppendLine("</changefreq>");
        strBuilder.AppendLine("<priority>");
        strBuilder.AppendLine("0.5");
        strBuilder.AppendLine("</priority>");
        strBuilder.AppendLine("</url>");
    }

    #endregion

    #region Articles

    //Aynı şekilde makalelerimizi veritabanından çekiyoruz.
    var articles = _entity.Articles.ToList();

    //Makaleleler içinde foreach ile dönüyoruz.
    foreach (var item in articles)
    {
        strBuilder.AppendLine("<url>");
        strBuilder.AppendLine("<loc>");
        string ArtURL = item.URL;
        //Makale linkini site haritasına ekliyoruz.
        URL = "http://mhmtyylc.com/" + ArtURL;
        strBuilder.AppendLine("</loc>");
        strBuilder.AppendLine("<changefreq>");
        strBuilder.AppendLine("weekly");
        strBuilder.AppendLine("</changefreq>");
        strBuilder.AppendLine("<priority>");
        strBuilder.AppendLine("0.5");
        strBuilder.AppendLine("</priority>");
        strBuilder.AppendLine("</url>");
    }

    #endregion

    strBuilder.AppendLine("</urlset>");

    //oluşturduğumuz string ifadeyi geri döndürüyoruz.
    return strBuilder.ToString();
}

Site haritasını oluşturduktan sonra View da bunu yazdırmamız gerekiyor.

public ViewResult SiteMap()
{
    Response.ContentType = "text/xml";
    Response.Write(Business.SiteMapXML()); //Oluşturdumuz metodu burada yazdırıyoruz.
    Response.End();

    return View();
}

İşlemimiz tamamlandı. Artık sitemizin içeriği değiştidiğinde site haritamız dinamik olarak oluşturulacak. Kolay gelsin.

Mehmet YAYLACI
YORUMLAR (8)
  1. Osman UYAR
    Osman UYAR

    03 Ocak 2012 - 13:16

    Kanka sınırsız kategoriyle nasıl yaparsın peki hersey böyle olmaz bazen degilmi _? Kullanıcı sınırsız kategori ve alt kategori eklerse nasıl çalışır acaba bu _?

  2. hayalci
    hayalci

    17 Şubat 2012 - 13:14

    Response.Write(Business.SiteMapXML());burdaki Business in altını çiziyor ne yaptıysam olmadı yardım eder misiniz

    • Mehmet YAYLACI
      Mehmet YAYLACI

      18 Şubat 2012 - 21:12

      Ordaki Business benim sitemapi içinde barındıran sınıfın adı. SiteMapXML() ise zaten fonksiyonun adı. Sen hangi class içinde yazmışsan fonksiyonu o şekilde çağıracaksın.SınıfınAdi.FonksiyonAdi() şeklinde.

  3. yiğit
    yiğit

    31 Temmuz 2013 - 20:01

    This page contains the following errors:error on line 5 at column 1: Document is emptyBelow is a rendering of the page up to the first error.Hatası alıyorum. Debug edip bakıyorum dolu geliyor . Ama hostta atınca bu şekil bir hata veriyor.Localde ise XML Parsing Error: not well-formedLocation: http://localhost:61067/Home/SiteMapLine Number 5, Column 6: şeklinde bir hata alıyorum durumu çözemedim bir türlü

    • Mehmet YAYLACI
      Mehmet YAYLACI

      31 Temmuz 2013 - 21:34

      Büyük ihtimal xml etiketlerinin sözdiziminde yanlışlık var. Ama tabi ki kodları görmeden sorunun nerede olduğunu kesin olarak söyleyemeyiz.

  4. Davut
    Davut

    02 Ekim 2014 - 13:20

    2. Adımı anlayamadım tam olarak nereye yazmalıyız ?

    • Mehmet YAYLACI
      Mehmet YAYLACI

      04 Ekim 2014 - 18:50

      2. adımda Controller'da Response.Write diyerek oluşturulan bilgileri View dosyasına gönderiyoruz.

  5. Orhan KADIOĞLU
    Orhan KADIOĞLU

    25 Şubat 2017 - 13:58

    Mehmet YAYLACI hocam çok sağolun. Çok işime yaradı.

YORUM YAPIN