Lendo um arquivo OPML recursivamente em Ruby (REXML)

Brincando um pouco com Ruby e RSS, achei esse link em que o cara mostra como ler um arquivo OPML recursivamente, armazenando os feeds em um hash em que a url é a chave e os valores são um array com as categorias. Nos comentários eles discutem um problema quando um mesmo feed é armazenado em várias categorias. Segundo o código do post, o feed era apresentado apenas com a última categoria atribuída.

O problema era na “volta” da recursão, quando os resultados eram adicionados aos resultado final. Segundo o método Hash#merge!, as chaves já existentes são sobrescritas com os novos valores. Mas há uma opção (não muito bem documentada) de passar um bloco para a chamada de merge! que recebe como parâmetros a chave e os valores antigos e novos no caso de registros já existentes. Dessa forma, é possível “adicionar” os valores e não apenas sobrescrever.

Código da função:

# parse_opml (opml_node, parent_names=[])
#
# takes an REXML::Element that has OPML outline nodes as children, 
# parses its subtree recursively and returns a hash:
# { feed_url => [parent_name_1, parent_name_2, ...] } 
#
def parse_opml(opml_node, parent_names=[])
  feeds = {}
  opml_node.elements.each('outline') do |el|
    if (el.elements.size != 0)
		tmp_feed = parse_opml(el,parent_names + [el.attributes['text']])
		feeds.merge!(tmp_feed) do | key, oldval, newval |
			feeds[key] = oldval + newval
		end
    end
    if (el.attributes['xmlUrl'])
      feeds[el.attributes['xmlUrl']] = parent_names
    end
  end
  return feeds
end

Um Comentário

  1. Pingback: Ruby Brasil - » Lauro Moura: Lendo um arquivo OPML recursivamente (REXML)


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s