Arquivos

Posts Etiquetados ‘xml’

MVC – Sitemap simples e eficiente

No blog www.rafaelalmeida.net, postei a pouco tempo sobre sitemaps com o asp.net MVC. Ficou bem bacana então resolvi replicar aqui. Vale lembrar que a solução inicial foi do Joel Abrahamssom e minha solução apresentada abaixo difere apenas em alguns pontos com por exemplo a maneira de criar os itens que vão ser exibidos.
O código é bem simples e intuitivo, caso alguém ainda tenha dúvida deixa um comentário.

namespace RafaelAlmeida.Controllers
{
    public class SitemapController : Controller
    {
        //
        // GET: /Sitemap/
        public XmlSitemapResult Index()
        {
	    /// Monta o site map
            var itens = new SitemapItensCollection();
            AddEntries(ref itens);

            return new XmlSitemapResult(itens);
        }

        private void AddEntries(ref SitemapItensCollection itens)
        {
	    /// Identifica os posts que vão para o sitemap
            var repository = new Models.BlogRepository();
            foreach (var post in repository.getPosts())
            {
                itens.Add(new SitemapItem(@"http://www.rafaelalmeida.net/post/" + post.name) { ChangeFrequency= ChangeFrequency.Weekly, Priority=1, LastModified = post.date});
            }
        }
    }
}

namespace net.rafaelalmeida.XmlSitemap
{
    public class XmlSitemapResult : ActionResult
    {
	/// Itens
        private readonly SitemapItensCollection _items;

	/// Construtor
        public XmlSitemapResult(SitemapItensCollection items)
        {
            _items = items;
        }

	/// Gera o xml com o sitemap
        public override void ExecuteResult(ControllerContext context)
        {
            context.HttpContext.Response.ContentType = "application/rss+xml";
            context.HttpContext.Response.Flush();

            var ser = new XmlSerializer(typeof(SitemapItensCollection));
            ser.Serialize(context.HttpContext.Response.Output, _items);
        }
    }
}

namespace net.rafaelalmeida.XmlSitemap
{
    /// Coloca os namespaces
    [XmlType(Namespace = "http://www.google.com/schemas/sitemap/0.84", TypeName = "urlset")]
    [XmlRootAttribute(Namespace = "http://www.google.com/schemas/sitemap/0.84", ElementName = "urlset", IsNullable = false)]
    public class SitemapItensCollection: List<SitemapItem>
    {

    }
}

namespace net.rafaelalmeida.XmlSitemap
{
    [XmlTypeAttribute(TypeName = "url")]
    public class SitemapItem : ISitemapItem
    {
	/// Construtor
        public SitemapItem()
        {

        }

	/// Construtor
        public SitemapItem(string url)
        {
            Url = url;
        }

	/// Url do Post
        [XmlElementAttribute( DataType = "anyURI", ElementName= "loc")]
        public string Url { get; set; }

	/// Data de modificação
        [XmlElementAttribute(DataType = "date", ElementName = "lastmod")]
        public DateTime? LastModified { get; set; }

	/// Frequencia de atualização
        [XmlElementAttribute( ElementName = "changefreq")]
        public ChangeFrequency? ChangeFrequency { get; set; }

	/// Prioridade
        [XmlElementAttribute(ElementName = "priority")]
        public float? Priority { get; set; }
    }
}

namespace net.rafaelalmeida.XmlSitemap
{
    /// Tipos de Frequencia
    public enum ChangeFrequency
    {
        Always,
        Hourly,
        Daily,
        Weekly,
        Monthly,
        Yearly,
        Never
    }
}

namespace net.rafaelalmeida.XmlSitemap
{
    /// Interface de item do sitemap
    public interface ISitemapItem
    {
	/// URL
        string Url { get; }

	/// Data de modificação
        DateTime? LastModified { get; }

	/// Frequencia de atualização
        ChangeFrequency? ChangeFrequency { get; }

	/// Prioridade
        float? Priority { get; }
    }
}

Um exemplo dele funcionando é o sitemap do meu blog pessoal http://rafaelalmeida.net/sitemap/index.

Categorias.NET, asp.net, MVC, SEO, SiteMap, XML Tags:, , , ,

XML – Parse de XML

Após ajudar um colega aqui do trabalho e ler o post Don’t Parse That XML do elegantcode.com, vi que isso é um problema GRAVE!!

Antes de escrever sobre… Galeraaa fazer parse de XML com string.find e replace NÃO É LEGAL!

O post do elegantcode nos mostra um jeito muito mais fácil e rápido para montar objetos de um XML já formado, porém não é sempre que queremos montar objetos para ler um arquivo rápido. Para isso usamos o seguinte código:

XmlDocument documentoXml = new XmlDocument();
documentoXml.Load("arquivoDeEntrada"); //podemos carregar também por stream, texto, etc...
XmlNodeList listaDeNos = documentoXml.SelectNodes("/noraiz/noprimeirofilho/nosegundofilho");

foreach (XmlNode node in listaDeNos)
{
    //todos os nós vem aqui!
}

Com esse código todos os nós “nosegundofilho” serão obtidos:

<noraiz>
   <noprimeirofilho>
      <nosegundofilho>lala</nosegundofilho>
   </noprimeirofilho>
</noraiz>

Viram! Simples e já nos retorna todos os nós que queremos!
Agora para acessar os valores de tags internas:
node.ChildNodes["nomeDaTag"].InnerText;

E os atributos:
node.Attributes["nome"].Value;

Abraço a todos!

Categorias.NET, XML Tags:, ,
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.