Artigos com o marcador xml

Usando o XStream para serializar e desserializar objetos Java para XML

O XStream é uma biblioteca simples e poderosa que facilita muito nossa vida quando precisamos serializar objetos Java para arquivos XML e também para fazer o processo inverso. A partir de JavaBeans podemos escrever os XML com poucas linhas de código.

Nesse artigo o uso básico e o intermediário do XStream. Veremos como serializar e desserializar objetos, o uso de aliases e list.

O ambiente que usei para criar esse artigo foi o seguinte:

  • Windows XP – SP3
  • JDK 6
  • Eclipse 3.4 – Ganymede
  • XStream 1.3.1

Para começar, precisamos baixar a biblioteca para ser usada. Acessem o site oficial do XStream (http://xstream.codehaus.org), cliquem em “Download” e baixem a última versão da versão binária (Binary Distribution).

Depois de baixado, descompacte o arquivo e você verá diversos arquivos JARs. Não precisamos de todos, porém se quiser pode adicionar todos no classpath do seu projeto ou aqueles que mais se encaixarem em suas necessidades. No site do XStream tem uma explicação sobre cada uma das dependências opcionais. Acesse: http://xstream.codehaus.org/download.html.

Depois de adicionar os JARs no classpath, estamos prontos para começar a codificar. Nosso primeiro exemplo será serializar um objeto simples (JavaBean) para XML. Vamos criar esse objeto:

 
package com.meupost.beans;
 
public class Agenda {
 
	private String nomePessoa;
	private int idade;
	private String email;
	private String telefone;
	private String fax;
 
	public String getNomePessoa() {
		return nomePessoa;
	}
 
	public void setNomePessoa(String nomePessoa) {
		this.nomePessoa = nomePessoa;
	}
 
	public int getIdade() {
		return idade;
	}
 
	public void setIdade(int idade) {
		this.idade = idade;
	}
 
	public String getEmail() {
		return email;
	}
 
	public void setEmail(String email) {
		this.email = email;
	}
 
	public String getTelefone() {
		return telefone;
	}
 
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
 
	public String getFax() {
		return fax;
	}
 
	public void setFax(String fax) {
		this.fax = fax;
	}
}

Beleza! O objeto é esse. Vamos mandar ele para um XML. No nosso exemplo faço a serialização direto no void main(). Vejam:

package com.meupost.main;
 
import com.meupost.beans.Agenda;
import com.thoughtworks.xstream.XStream;
 
public class Main {
 
    public static void main(String args[]) {
 
         Agenda a1 = new Agenda();
 
         a1.setEmail("amigo1@email.com.br");
         a1.setFax("123-4567");
         a1.setIdade(55);
         a1.setNomePessoa("Fernando Pessoa");
         a1.setTelefone("654-3210");
         XStream x = new XStream();
 
         System.out.println(x.toXML(a1));
 
    }
}

A saída será assim:

<com.meupost.beans.Agenda>
  <nomePessoa>Fernando Pessoa</nomePessoa>
  <idade>55</idade>
  <email>amigo1@email.com.br</email>
  <telefone>654-3210</telefone>
  <fax>123-4567</fax>
</com.meupost.beans.Agenda>

Muito bom. Mas agora vamos complicar mais um pouco. Vamos criar mais um objeto chamado Endereco que vai conter onde nosso indivíduo mora. Esse objeto Endereco entrará como atributo do objeto Agenda. Vejam o exemplo abaixo de como fica e o resultado do XML.

Objeto Endereco:

 
package com.meupost.beans;
 
public class Endereco {
 
	private String rua;
	private int numero;
	private String cidade;
	private String estado;
 
	public String getRua() {
		return rua;
	}
 
	public void setRua(String rua) {
		this.rua = rua;
	}
 
	public int getNumero() {
		return numero;
	}
 
	public void setNumero(int numero) {
		this.numero = numero;
	}
 
	public String getCidade() {
		return cidade;
	}
 
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
 
	public String getEstado() {
		return estado;
	}
 
	public void setEstado(String estado) {
		this.estado = estado;
	}
}

Objeto Agenda. Reparem que adicionamos o atributo Endereco!

package com.meupost.beans;
 
public class Agenda {
 
	private String nomePessoa;
	private int idade;
	private String email;
	private String telefone;
	private String fax;
	private Endereco endereco;
 
	public String getNomePessoa() {
		return nomePessoa;
	}
 
	public void setNomePessoa(String nomePessoa) {
		this.nomePessoa = nomePessoa;
	}
 
	public int getIdade() {
		return idade;
	}
 
	public void setIdade(int idade) {
		this.idade = idade;
	}
 
	public String getEmail() {
		return email;
	}
 
	public void setEmail(String email) {
		this.email = email;
	}
 
	public String getTelefone() {
		return telefone;
	}
 
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
 
	public String getFax() {
		return fax;
	}
 
	public void setFax(String fax) {
		this.fax = fax;
	}
 
	public Endereco getEndereco() {
		return endereco;
	}
 
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
}

E agora o teste e resultado:

package com.meupost.main;
 
import com.meupost.beans.Agenda;
import com.meupost.beans.Endereco;
import com.thoughtworks.xstream.XStream;
 
public class Main {
 
    public static void main(String args[]) {
 
        Agenda a1 = new Agenda();
 
        a1.setEmail("amigo1@email.com.br");
        a1.setFax("123-4567");
        a1.setIdade(55);
        a1.setNomePessoa("Fernando Pessoa");
        a1.setTelefone("654-3210");
 
        Endereco end = new Endereco();
        end.setRua("Rua Saldanha Marinho");
        end.setNumero(1234);
        end.setCidade("São José do Rio Preto");
        end.setEstado("São Paulo");
 
        a1.setEndereco(end);
        XStream x = new XStream();
 
        System.out.println(x.toXML(a1));
 
     }
}

Ótimo. E por fim o XML gerado:

<com.meupost.beans.Agenda>
  <nomePessoa>Fernando Pessoa</nomePessoa>
  <idade>55</idade>
  <email>amigo1@email.com.br</email>
  <telefone>654-3210</telefone>
  <fax>123-4567</fax>
  <endereco>
    <rua>Rua Saldanha Marinho</rua>
    <numero>1234</numero>
    <cidade>São José do Rio Preto</cidade>
    <estado>São Paulo</estado>
  </endereco>
</com.meupost.beans.Agenda>

Viram que dentro do nó endereco temos os atributos que definimos no nosso objeto? Pois bem, é assim que você pode relacionar os JavaBeans.

Vocês já devem ter percebido que o nome do nó raiz ta o mesmo nome do pacote. Isso com certeza é um incoveniente muito grande quando colocamos nosso sistema em produção. Para arrumarmos isso, podemos usar os Aliases que o XStream oferece. Basta uma linha de código. Vamos mudar nosso método void main() adicionando o alias e vamos gerar o XML novamente. Vejam:

package com.meupost.main;
 
import com.meupost.beans.Agenda;
import com.meupost.beans.Endereco;
import com.thoughtworks.xstream.XStream;
 
public class Main {
 
    public static void main(String args[]) {
 
        Agenda a1 = new Agenda();
 
        a1.setEmail("amigo1@email.com.br");
        a1.setFax("123-4567");
        a1.setIdade(55);
        a1.setNomePessoa("Fernando Pessoa");
        a1.setTelefone("654-3210");
 
        Endereco end = new Endereco();
        end.setRua("Rua Saldanha Marinho");
        end.setNumero(1234);
        end.setCidade("São José do Rio Preto");
        end.setEstado("São Paulo");
 
        a1.setEndereco(end);
 
       XStream x = new XStream();
       //Adicionei nova linha aqui!
       x.alias("agenda", Agenda.class);
 
       System.out.println(x.toXML(a1));
 
    }
}

E o resultado:

<agenda>
  <nomePessoa>Fernando Pessoa</nomePessoa>
  <idade>55</idade>
  <email>amigo1@email.com.br</email>
  <telefone>654-3210</telefone>
  <fax>123-4567</fax>
  <endereco>
    <rua>Rua Saldanha Marinho</rua>
    <numero>1234</numero>
    <cidade>São José do Rio Preto</cidade>
    <estado>São Paulo</estado>
  </endereco>
</agenda>

Agora, vamos fazer o processo inverso. Ao invés de escrevermos o XML, vamos ler e criar os objeto a partir do XML. Para facilitar, vamos usar nossos objetos já criados (Agenda e Endereco). Abaixo há um exemplo onde crio um objeto String com o XML a ser lido, passo a String ao XStream e o próprio se encarrega de criar nossos objetos JavaBean de volta sem esforço nenhum.

package com.meupost.main;
 
import com.meupost.beans.Agenda;
import com.meupost.beans.Endereco;
import com.thoughtworks.xstream.XStream;
 
public class Main {
 
    public static void main(String args[]) {
 
        String xml;
 
        xml = "<agenda>" +
        "<nomePessoa>Angelina Jolie</nomePessoa>" +
        "<idade>35</idade>" +
        "<email>angelina@jolie.com</email>" +
        "<telefone>1742-5236</telefone>" +
        "<fax>6541-222</fax>" +
        "<endereco>" +
             ="<rua>Rubião Júnior</rua>" +
            "<numero>2104</numero>" +
            "<cidade>São José do Rio Preto</cidade>" +
            "<estado>São Paulo</estado>" +
        "</endereco>" +
        "</agenda>";
 
        XStream x = new XStream();
 
        x.alias("agenda", Agenda.class);
        Agenda a = (Agenda) x.fromXML(xml);
 
        System.out.println(a.getNomePessoa());
    }
}

Vejam que no exemplo acima eu precisei indicar qual a classe que o nó raiz “agenda” fazia parte. Depois foi só passar o XML para o XStream e fazer o Cast para obter o objeto. Por fim exibimos em console o nome da Angelina!

Agora mais um problema tanto para leitura quanto para escrita do XML. E quando temos várias informações dentro de um nó? Por exemplo, temos um XML precido com esse abaixo:

<agenda>
  <pessoas>
    <pessoa>
      <nomePessoa>Fernando Pessoa</nomePessoa>
      <idade>55</idade>
      <email>amigo1@email.com.br</email>
      <telefone>124-6984</telefone>
      <fax>654-3210</fax>
      <endereco>
        <rua>Rua Saldanha Marinho</rua>
        <numero>5110</numero>
        <cidade>São José do Rio Preto</cidade>
        <estado>São Paulo</estado>
      </endereco>
    </pessoa>
    <pessoa>
      <nomePessoa>felipao@email.com.br</nomePessoa>
      <idade>60</idade>
      <email>amigo1@email.com.br</email>
      <telefone>2310-1110</telefone>
      <fax>211-4100</fax>
      <endereco>
        <rua>Rua Francisco Glicério</rua>
        <numero>210</numero>
        <cidade>Campinas</cidade>
        <estado>São Paulo</estado>
      </endereco>
    </pessoa>
    <pessoa>
      <nomePessoa>Raul Seixas</nomePessoa>
      <idade>78</idade>
      <email>raulzito@email.com.br</email>
      <telefone>222-2222</telefone>
      <fax>111-1111</fax>
      <endereco>
        <rua>Rua Mar Vermelho</rua>
        <numero>450</numero>
        <cidade>Babilônia</cidade>
        <estado>São Paulo</estado>
      </endereco>
    </pessoa>
  </pessoas>
</agenda>

Temos vários nós pessoa. Como se fosse uma lista de pessoas. E para tratarmos isso com o XStream? Temo como? Sim, lógico que tem. Primeiramente vamos criar o objeto (JavaBean) Pessoa contendo os mesmos atributos que havia no objeto Agenda, pois agora o objeto Agenda vai conter somente um atributo que é a lista de pessoas. Veja como fica o objeto Agenda e o objeto Pessoa:

Agenda:

package com.meupost.beans;
 
import java.util.ArrayList;
import java.util.List;
 
public class Agenda {
 
	private List<Pessoa> pessoas = new ArrayList<Pessoa>();
 
	public void add(Pessoa pessoa) {
		this.pessoas.add(pessoa);
	}
 
	public List<Pessoa> getContent() {
		return this.pessoas;
	}
}

Pessoa:

package com.meupost.beans;
 
public class Pessoa {
 
	private String nomePessoa;
	private int idade;
	private String email;
	private String telefone;
	private String fax;
	private Endereco endereco;
 
	public String getNomePessoa() {
		return nomePessoa;
	}
 
	public void setNomePessoa(String nomePessoa) {
		this.nomePessoa = nomePessoa;
	}
 
	public int getIdade() {
		return idade;
	}
 
	public void setIdade(int idade) {
		this.idade = idade;
	}
 
	public String getEmail() {
		return email;
	}
 
	public void setEmail(String email) {
		this.email = email;
	}
 
	public String getTelefone() {
		return telefone;
	}
 
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
 
	public String getFax() {
		return fax;
	}
 
	public void setFax(String fax) {
		this.fax = fax;
	}
 
	public Endereco getEndereco() {
		return endereco;
	}
 
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
}

Viram a diferença? Agora o objeto agenda possui uma List onde podemos ir adicionando o objeto Pessoa. O XStream ficará responsável de ler essa List e colocar no XML. Abaixo veja o exemplo de preenchimento dos objetos e o resultado depois que o XStream transforma para XML:

package com.meupost.main;
 
import com.meupost.beans.Agenda;
import com.meupost.beans.Endereco;
import com.meupost.beans.Pessoa;
import com.thoughtworks.xstream.XStream;
 
 
public class Main {
 
     public static void main(String args[]) {
 
		Agenda a1 = new Agenda();
 
		Pessoa p1 = new Pessoa();
		p1.setEmail("amigo1@email.com.br");
		p1.setFax("654-3210");
		p1.setIdade(55);
		p1.setNomePessoa("Fernando Pesso");
		p1.setTelefone("124-6984");
		Endereco e1 = new Endereco();
		e1.setRua("Rua Saldanha Marinho");
		e1.setCidade("São José do Rio Preto");
		e1.setNumero(5110);
		e1.setEstado("São Paulo");
		p1.setEndereco(e1);
 
		Pessoa p2 = new Pessoa();
		p2.setEmail("amigo1@email.com.br");
		p2.setFax("211-4100");
		p2.setIdade(60);
		p2.setNomePessoa("felipao@email.com.br");
		p2.setTelefone("2310-1110");
		Endereco e2 = new Endereco();
		e2.setRua("Rua Francisco Glicério");
		e2.setCidade("Campinas");
		e2.setNumero(210);
		e2.setEstado("São Paulo");
		p2.setEndereco(e2);
 
		Pessoa p3 = new Pessoa();
		p3.setEmail("raulzito@email.com.br");
		p3.setFax("111-1111");
		p3.setIdade(78);
		p3.setNomePessoa("Raul Seixas");
		p3.setTelefone("222-2222");
		Endereco e3 = new Endereco();
		e3.setRua("Rua Mar Vermelho");
		e3.setCidade("Babilônia");
		e3.setNumero(450);
		e3.setEstado("São Paulo");
		p3.setEndereco(e3);
 
		a1.add(p1);
		a1.add(p2);
		a1.add(p3);
 
		XStream x = new XStream();
		x.alias("agenda", Agenda.class);
		x.alias("pessoa", Pessoa.class);
		String xml = x.toXML(a1);
 
		System.out.println(xml);
    }
}

E a nossa saída em XML:

<agenda>
  <pessoas>
    <pessoa>
      <nomePessoa>Fernando Pesso</nomePessoa>
      <idade>55</idade>
      <email>amigo1@email.com.br</email>
      <telefone>124-6984</telefone>
      <fax>654-3210</fax>
      <endereco>
        <rua>Rua Saldanha Marinho</rua>
        <numero>5110</numero>
        <cidade>São José do Rio Preto</cidade>
        <estado>São Paulo</estado>
      </endereco>
    </pessoa>
    <pessoa>
      <nomePessoa>felipao@email.com.br</nomePessoa>
      <idade>60</idade>
      <email>amigo1@email.com.br</email>
      <telefone>2310-1110</telefone>
      <fax>211-4100</fax>
      <endereco>
        <rua>Rua Francisco Glicério</rua>
        <numero>210</numero>
        <cidade>Campinas</cidade>
        <estado>São Paulo</estado>
      </endereco>
    </pessoa>
    <pessoa>
      <nomePessoa>Raul Seixas</nomePessoa>
      <idade>78</idade>
      <email>raulzito@email.com.br</email>
      <telefone>222-2222</telefone>
      <fax>111-1111</fax>
      <endereco>
        <rua>Rua Mar Vermelho</rua>
        <numero>450</numero>
        <cidade>Babilônia</cidade>
        <estado>São Paulo</estado>
      </endereco>
    </pessoa>
  </pessoas>
</agenda>

Bem, estamos chegando quase no fim do artigo. Mostrei como usar o XStream para escrever XML e como ler. Ainda há muito o que aprender sobre o XStream como os aliases de campo (aliasField) e atributos. Mas esse artigo não irá se aprofundar tanto. Espero que com o que foi mostrado e ensinado aqui seja o suficiente para um início. Há um pouco de material de estudo no site do XStream, mas também é básico. O melhor mesmo é ir no Google ou mexer no JavaDoc do XStream (http://xstream.codehaus.org/javadoc/index.html).

Para praticar você pode usar diversas APIs disponíveis como o do YouTube, Mercado Livre, Yahoo… Esses XMLs são mais complexos e são ótimos para estudo.

Até a próxima!

  • Share/Bookmark

Lendo XML com o REXML – Ruby

Ruby tem hoje uma das bibliotecas mais impressionantes e fáceis para se manipular informações em formato XML. A biblioteca REXML (Ruby Electric XML).

Essa biblioteca é baseada na biblioteca Electric XML para Java, porém em Ruby é bem mais fácil de se usar tal biblioteca. Aliás, você não fica restrito apenas a manipulação de XML com o REXML, você também poderá usá-la para manipulação de informações no formato XHTML. Como o XHTML tem padrões rigorosos definidos, podemos usar o REXML tranqüilamente. Mas se você precisa manipular HTML, use o hpricot.

Nesse post, eu mostro o básico de uma leitura XML usando a REXML. Em nosso exemplo utilizaremos o webservice de pesquisa do Yahoo. Basicamente iremos ler o XML que o Yahoo nos fornece e iremos exibi-los em console.

Primeiro de tudo vamos ver qual a estrutura do XML que o Yahoo nos fornece para fazermos a leitura. A URL do XML é essa: http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=YahooDemo&query=metallica&results=5

Repare na URL que eu passei acima as variáveis que passei via GET. Uma é a palavra chave de busca (query) e a outra o número de resultados que eu quero por página (results). Estão com os valores “metallica” e “5” respectivamente. Se quiser se aprofundar na API de busca do Yahoo, consulte o site do developers do Yahoo.

Voltando a XML fornecida pelo Yahoo, vamos analisa-la:

Estrutura básica do XML do Yahoo

Cada “caixa” em azul representa um nó no XML. Tudo começa com um nó raiz (ResultSet) e depois desce para o nó de resultado (Result). Esse nós repsenta um item do resultado da pesquisa feita no Yahoo. Se houve mais resultados, então o nó Result é repetido.

Em nosso tutorial, vamos ler as informações que estão nos nós “Title”, “Summary”, “Url” e “MimeType” que não se encontra no mapeamento acima porque não houve espaço para colocar todos os nós. De uma olhada no documento do Yahoo que você irá ver lá.

Agora que sabemos as informações que iremos ler, vamos começar a codificar.

Vamos criar uma classe “Buscador” que irá se conectar ao webservice do Yahoo, ler toda a XML e inicializar nossos atributos de instância no construtor. Depois criaremos um método que irá ler os nós  específicos do XML que queremos.

Comecemos pelos imports das bibliotecas e pelo construtor:

# Leitura de XML usando a biblioteca REXML
# do Ruby. Em nosso exemplo usaremos o
# webservice de busca do Yahoo.
 
class Buscador
 
   # Import dos GEMs usados e do REXML
   require 'rubygems'
   require 'open-uri'
   require 'rexml/document'
 
   #Vamos inicializar as variáveis para a busca e instanciar
   #nosso objeto REXML que será usado para a busca no Yahoo.
   def initialize(keywords, resultado_pagina)
      @keywords = keywords
      @resultado_pagina = resultado_pagina
      @url_yahoo = "http://api.search.yahoo.com/WebSearchService/V1/
webSearch?appid=YahooDemo&amp;query=#{@keywords}&amp;results=#{@resultado_pagina}"
 
      # Aqui você pode usar o open do gem open-uri ou
      # a classe net/http. O open é bem mais simples :).
      xml_data = open(@url_yahoo)
      @obj_rexml = REXML::Document.new(xml_data.read)
   end
end

Repare no código acima que nosso construtor recebe dois parâmetros. O keywords são as palavras chave que usaremos na busca e o resultado_pagina é o número de resultados que queremos que sejam exibidos no XML. Esse parâmetros são aqueles já explicados acima nesse mesmo post.

Outro detalhe no código é o uso do open. Nele, passamos somente a URL que queremos ler e ele nos retorna os dados com o método read. Incrível. Cada vez mais eu gosto de Ruby!

Logo abaixo do open, está a instanciação do objeto REXML, o qual usaremos para ler o XML no método que criaremos.

Criado o construtor, vamos criar nosso pequeno método que faz a leitura do XML e nos retorna o resultado.

A cada resultado que o Yahoo nos retornar, iremos criar um hash para esse resultado. Preenchido o hash com as informações do XML colocaremos esse hash dentro de um array. Faremos isso até finalizar a leitura do XML. Terminada a leitura, retornaremos o array. Nossos resultados estarão bem estruturados dentro do array.

Vamos ao método da busca:

   # Esse método realiza a leitura do xml e retorna um array de hash
   # com o resultado da leitura.
   def buscar
      lista_resultado = Array.new #array com todos os resultados
 
      # Caminho dos nos no XML. Dependendo do que você quiser
      # no XML, vai ser aqui você irá muda.
      nos = "ResultSet/Result"
 
      # Loop entre os nos do XML definido acima
      @obj_rexml.elements.each(nos) do |elemento|
         resultado = Hash.new #hash que vai conter um resultado
 
         resultado[:titulo] = elemento.text("Title")
         resultado[:descricao] = elemento.text("Summary")
         resultado[:link] = elemento.text("Url")
         resultado[:tipo] = elemento.text("MimeType")
 
         # Guarda o hash no array e continua o loop
         lista_resultado < < resultado
      end
 
      # Retorna o Array com os resultados
      return lista_resultado
   end

Explicando o que se passa nesse método:

  • lista_resultado: Nosso array onde ficarão os hash de cada resultado individual.
  • nos: é o “caminho” no XML que queremos. Tudo o que estiver dentro desse caminho, ele irá nos retornar.
  • @obj_rexml.elements.each(nos) do |elemento|: Loop entre os nós dentro do caminho passado.
  • resultado: Hash que representa um resultado individual.
  • resultado[:titulo] = elemento.text(“Title”): Inserção no Hash (posição :title) o elemento XML que contém um nó chamado “Title”.
  • lista_resultado << resultado: Insere o hash no array
  • return lista_resultado: Retorna o array com os resultados!

O método .text(nó) chamado pelo objeto elemento significa que queremos o texto que está dentro do nó passado como parâmetro. Quando há um atributo no nó, podemos utilizar o método .attributte(atributo). Por exemplo, supondo que um nó possua um atributo “id=5” da seguinte forma: <title id=”5”>Texto do Título</title>. Então poderíamos utilizar o método assim:

elemento.attributte(“id”)
=> 5

Bem legal!

Pronto! Muito simples. Nossa classe está pronta. No final das contas teremos o seguinte código:

class Buscador
 
   require 'rubygems'
   require 'open-uri'
   require 'rexml/document'
 
   def initialize(keywords, resultado_pagina)
      @keywords = keywords
      @resultado_pagina = resultado_pagina
      @url_yahoo = "http://api.search.yahoo.com/WebSearchService/V1/
webSearch?appid=YahooDemo&amp;query=#{@keywords}&amp;results=#{@resultado_pagina}"
 
      xml_data = open(@url_yahoo)
      @obj_rexml = REXML::Document.new(xml_data.read)
   end
 
   def buscar
      lista_resultado = Array.new #array com todos os resultados
 
      nos = "ResultSet/Result"
 
      @obj_rexml.elements.each(nos) do |elemento|
         resultado = Hash.new #hash que vai conter um resultado
 
         resultado[:titulo] = elemento.text("Title")
         resultado[:descricao] = elemento.text("Summary")
         resultado[:link] = elemento.text("Url")
         resultado[:tipo] = elemento.text("MimeType")
 
         lista_resultado < < resultado
      end
 
      return lista_resultado
   end
 
end

Para testarmos a classe recém-criada, você pode implementar o seguinte script logo após o fechamento da classe:

# Configurações do script
# As configurações abaixo são configurações básicas para uso no
# webservie do Yahoo.
keywords = "metallica+one"
resultados_por_pagina = 10
 
busca = Buscador.new(keywords, resultados_por_pagina)
resultados = busca.buscar
 
resultados.each do |item_achado|
   puts "Titulo: #{item_achado[:titulo]}"
   puts "Descricao: #{item_achado[:descricao]}"
   puts "Link: #{item_achado[:link]}"
   puts "Tipo: #{item_achado[:tipo]}"
   puts "-------------------------------------"
end

Executando o nosso exemplo teremos os seguintes exemplos de resultados:

Titulo: One (Metallica song) - Wikipedia, the free encyclopedia
Descricao: Metallica won their first Grammy Award in 1990 for "One", winning Best Metal ... "One" was written in November 1987 by Metallica's principal composers — rhythm ...
Link: http://en.wikipedia.org/wiki/One_(Metallica_song)
Tipo: text/html
-------------------------------------
Titulo: YouTube - Metallica - One
Descricao: Video of One by MetallicAMovie: Johnny Got His Gun ... one of the best songs by MetallicA. kingxwrong (2 hours ago) Show Hide +1. Marked as spam ...
Link: http://www.youtube.com/watch?v=-j39ABZyzek
Tipo: text/html
-------------------------------------
Titulo: YouTube - Metallica- One
Descricao: Metallica's music video "One" ... One - Metallica (Live 1989) 07:00 From: metallicafx. Views: 2,551,898. Loading...
Link: http://www.youtube.com/watch?v=JwW9L_qzqp8
Tipo: text/html

Com esse simples (bem simples mesmo) exemplo que criamos, mostramos a força do REXML. Usando o próprio Yahoo, podemos criar nosso próprio search engine com o Rails baseado no motor de busca do Yahoo. Por que não? Afinal as possibilidade são infinitas.

Se quiser se aprender mais sobre a manipulação de REXML segue alguns links:

É isso pessoal. Espero que tenham gostado do REXML assim como eu e até o próximo post!

  • Share/Bookmark