por Cesar Cassiano Schimanco

Sitemap dinâmico - ASP.NET

O sitemap é um arquivo XML que contém URLs das páginas do seu site. Embora este arquivo seja uma das melhores formas dos buscadores encontrarem nossas páginas, isso não garantirá que todas serão indexadas. Mas sem duvida é um arquivo importantíssimo.
Existem muitos sites que geram sitemaps automaticamente, basta informar a URL que ele gera tudo automaticamente. Um exemplo de site que gera sitemaps é este:
www.xml-sitemaps.com
Agora pra quem tem conteúdo dinâmico, como produtos, usar um destes sites para gerar o sitemap será inviável. Então neste artigo vou mostrar como gerar um sitemap automaticamente em ASP.NET.
O arquivo deve ser no formato XML, mas não quer dizer que a extensão precisa ser esta, a extensão do sitemap pode ser ASP.NET (sitemap.aspx).
Abaixo vou mostrar uma estrutura básica de um sitemap que constituída de

  • URL
  • Última modificação
  • Frequência de modificação (None, Always, Hourly, Daily, Weekly, Monthly, Yearly, Never)
  • Prioridade (1.00, 0.80, 0.50…)

 Agora vamos ver como gerar sitemap com ASP.NET em 2 exemplos, o sitemap.aspx e o sitemap.ashx.

Sitemap.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="sitemap.aspx.cs" Inherits="sitemap2.sitemap" %>


Sitemap.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using System.Text;

namespace sitemap2
{
    public partial class sitemap : System.Web.UI.Page
    {
        XmlTextWriter xtw;
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Clear();
            //Esta linha vai fazer com que a página retorne um XML e não mais HTML
            Response.ContentType = "text/xml";

            //Criar o arquivo em memória usando a codificação UTF8
            xtw = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
            //A linha abaixo vai identar o código para não ficar em uma linha só.
            xtw.Formatting = Formatting.Indented;
            
            //Escreve a declaração do documento <?xml version="1.0" encoding="utf-8"?>
            xtw.WriteStartDocument();
            //cria o elemento raiz <urlset>
            xtw.WriteStartElement("urlset");
            //Adiciona o atributo xmlns
            xtw.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");

            /*Chama a função que vai criar o elemento URL no XML 
             * com loc = http://www.cbsa.com.br/default.aspx, 
             * lastmod = Data atual, 
             * changefreq = always 
             * e priority = 1.0 */
            WriteURLElement("http://www.cbsa.com.br/default.aspx", DateTime.Now, "1.0");
            //criar o elemento URL no XML para o item abaixo
            WriteURLElement("http://cbsa.com.br/categoria/C%23.aspx", DateTime.Now, "0.8");
            //criar o elemento URL no XML para o item abaixo
            WriteURLElement("http://www.cbsa.com.br/categoria/asp.net.aspx", DateTime.Now, "0.8");

            //libera o XmlTextWriter
            xtw.Flush();
            //fechar o XmlTextWriter
            xtw.Close();
            //Termina aqui
            Response.End();
        }

        /// <summary>
        /// Cria o elemento URL
        /// </summary>
        /// <param name="loc">URL</param>
        /// <param name="lastmod">Última modificação</param>
        /// <param name="priority">Prioridade</param>
        public void WriteURLElement(string loc, DateTime lastmod, string priority)
        {
            //Cria o elemento URL
            xtw.WriteStartElement("url");
            //Cria o elemento loc
            xtw.WriteElementString("loc", loc);
            //Cria o elemento lastmod
            xtw.WriteElementString("lastmod", lastmod.ToString("yyyy-MM-dd"));
            //Cria o elemento changefreq
            xtw.WriteElementString("changefreq", "always");
            //Cria o elemento priority
            xtw.WriteElementString("priority", priority);
            //Fecha o elemento URL
            xtw.WriteEndElement();
        }
    }
}


Resultado:

<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.cbsa.com.br/default.aspx</loc>
    <lastmod>2012-05-30</lastmod>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>http://cbsa.com.br/categoria/C%23.aspx</loc>
    <lastmod>2012-05-30</lastmod>
    <changefreq>always</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>http://www.cbsa.com.br/categoria/asp.net.aspx</loc>
    <lastmod>2012-05-30</lastmod>
    <changefreq>always</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

No exemplo abaixo vou criar os itens do sitemap dinamicamente com dados do banco de dados.

Sitemap.ashx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Text;
using System.Data.SqlClient;

namespace sitemap2
{
    /// <summary>
    /// Summary description for sitemap1
    /// </summary>
    public class sitemap1 : IHttpHandler
    {
        XmlTextWriter xtw;
        public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            //Esta linha vai fazer com que a página retorne um XML e não mais HTML
            context.Response.ContentType = "text/xml";

            //URL do site
            string sSiteURL = "http://www.cbsa.com.br";

            //Criar o arquivo em memória usando a codificação UTF8
            xtw = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8);
            //A linha abaixo vai identar o código para não ficar em uma linha só.
            xtw.Formatting = Formatting.Indented;

            //Escreve a declaração do documento <?xml version="1.0" encoding="utf-8"?>
            xtw.WriteStartDocument();
            //cria o elemento raiz <urlset>
            xtw.WriteStartElement("urlset");
            //Adiciona o atributo xmlns
            xtw.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");

            /*Chama a função que vai criar o elemento URL no XML 
             * com loc = http://www.cbsa.com.br/default.aspx, 
             * lastmod = Data atual, 
             * changefreq = always 
             * e priority = 1.0 */
            WriteURLElement(sSiteURL + "/default.aspx", DateTime.Now, "1.0");
            

            /*Agora vou criar os itens dinamicamente para os artigos do blog,
             todos com a data atual e prioridade 0.8*/

            //Criando a conexão
            using (SqlConnection Conn = new SqlConnection(ConnectionString))
            {
                //SQL Query
                string sSQL = @"SELECT contentURL FROM Articles";
                //Criando o SqlCommand
                SqlCommand myCommand = new SqlCommand(sSQL, Conn);
                //Abrindo a conexão
                Conn.Open();
                //SqlDataReader para buscar o resultado
                SqlDataReader dr = myCommand.ExecuteReader();

                //Lendo dados de cada registro
                while (dr.Read())
                {
                    //criar o elemento URL no XML para cada URL do banco de dados
                    WriteURLElement("http://www.cbsa.com.br/" + Convert.ToString(dr["contentURL"]), DateTime.Now, "0.8");
                }
                //Fechar conexão
                Conn.Close();
            }

            //libera o XmlTextWriter
            xtw.Flush();
            //fechar o XmlTextWriter
            xtw.Close();
            //Termina aqui
            context.Response.End();
        }

        /// <summary>
        /// Cria o elemento URL
        /// </summary>
        /// <param name="loc">URL</param>
        /// <param name="lastmod">Última modificação</param>
        /// <param name="priority">Prioridade</param>
        public void WriteURLElement(string loc, DateTime lastmod, string priority)
        {
            //Cria o elemento URL
            xtw.WriteStartElement("url");
            //Cria o elemento loc
            xtw.WriteElementString("loc", loc);
            //Cria o elemento lastmod
            xtw.WriteElementString("lastmod", lastmod.ToString("yyyy-MM-dd"));
            //Cria o elemento changefreq
            xtw.WriteElementString("changefreq", "always");
            //Cria o elemento priority
            xtw.WriteElementString("priority", priority);
            //Fecha o elemento URL
            xtw.WriteEndElement();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}


Download do projeto aqui

 

Comentários

Carregando comentários

Postar um novo comentário



Processando...