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.

YORUMLAR (13)

  1. Osman UYAR
    Osman UYAR
    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
    Response.Write(Business.SiteMapXML());
    burdaki Business in altını çiziyor ne yaptıysam olmadı yardım eder misiniz
    • Mehmet YAYLACI
      Mehmet YAYLACI
      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
    This page contains the following errors:

    error on line 5 at column 1: Document is empty
    Below 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-formed
    Location: http://localhost:61067/Home/SiteMap
    Line Number 5, Column 6:

    şeklinde bir hata alıyorum durumu çözemedim bir türlü
    • Mehmet YAYLACI
      Mehmet YAYLACI
      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
    2. Adımı anlayamadım tam olarak nereye yazmalıyız ?
    • Mehmet YAYLACI
      Mehmet YAYLACI
      2. adımda Controller'da Response.Write diyerek oluşturulan bilgileri View dosyasına gönderiyoruz.
  5. Orhan KADIOĞLU
    Orhan KADIOĞLU
    Mehmet YAYLACI hocam çok sağolun. Çok işime yaradı.
  6. Semih KAYA
    Semih KAYA
    Teşekkür ederim. Çok işime yaradı.
  7. murat öztürk
    murat öztürk
    Hocam çalıştırdım lakin değerlerin başında ve sonunda boşluklar oluşuyor
    <loc> www.domain.com </loc>
    <changefreq> weekly </changefreq>
    <priority> 0.6 </priority>
    • Mehmet YAYLACI
      Mehmet YAYLACI
      Boşluk oluşması için herhangi bir neden görünmüyor. Kodlamada başında ve sonunda boşluk bırakılmış olabilir mi acaba?
      • murat öztürk
        murat öztürk
        Hocam substringle çözdüm teşekkürler.Bir sorum daha olacaktı lastmod taki tarih gün ay yıl mı yoksa tersi mi olması gerekiyor yada farkediyor mu? teşekkürler.
        • Mehmet YAYLACI
          Mehmet YAYLACI
          YYYY-MM-DD formatında olması gerekiyor. Örnek: 2022-04-29

YORUM FORMU

Cevap verilen yorum:
  • Mehmet YAYLACI
    Mehmet YAYLACI
    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.