No post passado contei sobre o drama da migração do NeoMatrix Tech do Blogger para o Wordpress, onde consegui importar os posts (sem os comentários) depois de várias tentativas.

Uma dessas alternativas foi utilizar o Blogger Backup para que ele gravasse post a post no meu disco rígido, no formato Atom. Como o Wordpress aceita a importação de posts no formato RSS ao invés do Atom, tive que pesquisar uma ferramenta para converter entre estes dois formatos.

E eis que procurando achei o seguinte código em C#, no blog do Isaias Gonzalez (em inglês), e fiz duas pequenas adaptações:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Syndication;
using System.IO;
using System.Xml;

namespace Atom2RSS
{
    public class AtomToRss2Converter
    {
        public void AtomToRss20(string atomFileName, string rssFileName)
        {
            try
            {
                ConvertToRss20(ReadFeed(atomFileName), rssFileName);
            }
            catch (Exception ex)
            {
                throw new Exception("PAU no arquivo -> " + atomFileName);
            }
        }

        private static void ConvertToRss20(SyndicationFeed feed, string rssFileName)
        {
            Rss20FeedFormatter rss2 = new Rss20FeedFormatter(feed);
            XmlWriter writer = XmlWriter.Create(rssFileName);
            rss2.WriteTo(writer);
            writer.Close();
        }

        private static SyndicationFeed ReadFeed(string fileName)
        {
            StreamReader stream = new StreamReader(fileName);
            XmlReader reader = XmlReader.Create(stream);
            SyndicationFeed feed = SyndicationFeed.Load(reader);
            stream.Close();
            return feed;
        }
    }
}

Quando executei o código original, vi que o feed de saída não estava completo, faltando alguns itens no final. E isto acontecia em feeds de diversos tamanhos. Daí, reparando no código do cara, notei que no método ConvertToRss20() o XmlWriter não estava sendo fechado, assim como o StreamReader do método ReadFeed().

Acrescentei a chamada ao método Close() dos objetos supracitados e o programa funcionou.

Como você pode ver, o código é muito simples, ele utiliza as próprias classes nativas do .NET Framework, no namespace System.ServiceModel.Syndication para fazer a leitura e a gravação dos feeds. Para utilizar este namespace, adicione uma referência ao assembly System.ServiceModel.Web.

Fiz uma pequena aplicação Windows Forms que realiza a conversão em um lote de arquivos. A interface está bem tosca simples, mas plenamente funcional: Clique em Selecionar Arquivos, selecione os arquivos que quer converter, digite (ou procure) um diretório de saída, e clique em Converter.

Conversor Atom para RSS em lote

Baixe agora: Conversor Atom para RSS em lote (41 kB)

Um abraço!