Hospedagem Profissional

Hospedagem Profissional
Clique aqui e ganhe US$ 10,00 para testar durante 1 mês a melhor hospedagem: Digital Ocean!

quarta-feira, 22 de outubro de 2008

XStream: Trabalhando facilmente com XML em Java

Por Vinci Pegoretti Amorim 

Outra maneira de trabalhar com XML no java

 Download do material relacionado ao tutorial

Introdução

Partindo do pressuposto que o leitor já conhece XML e sua importância, este artigo pretende abordar como usar XStream para realizar mapeamento de objetos Java para Documentos XML e vice-versa. Também serão citadas as vantagens e limitações desta ferramenta. 

Existem diversas formas de se trabalhar com XML e Java, dentre elas, SAX, DOM, Digester. Cada uma serve ao seu propósito. Por exemplo, SAX é estremamente eficiente na leitura de arquivos. DOM, por sua vez oferece um melhor controle da estrutura hierárquica dos documentos XML, sendo mais adequado para a escrita de documentos para os quais não se tem total domínio da estrutura (esquema). 

Finalmente, Digester oferece uma forma interessante de mapear documentos XML para objetos Java e vice-versa. Entretanto, exige que o mapeamento seja manualmente configurado. 

E com vocês, XStream! XStream é uma outra forma de realiazar pontes XML-Java. 
Suas principais características, citadas na página oficial, são: 

  • Facilidade de uso. Geralmente só se precisa conhecer uma classe. 
  • Não é necessário configurar o mapeamento manualmente. XStream se baseia no mecanismo de Reflection pelo qual é possivel descobir dinamicamente quais os atributos de uma classe Java e os respectivos valores de seus objetos. 
  • XML legível e mais compacto que a serialização nativa de Java. 
  • Não exige que os objetos sigam alguma regra em particular. 
  • Suporta referências duplicadas e circulares dos objetos. 
  • Pode ser integrada com outras APIs. 
  • A estratégia de conversão pode ser configurada. 
  • Realiza uma avaliação prévia se o documento XML não está mal-formado, exibindo eventuais mensagens de erros. 

    A próxima seção abordará um exemplo de como XStream pode ser usado. 

    Inicialmente é necessário baixar o arquivo xstream*.jar e o xpp3*.jar em aqui. Na época que este artigo foi escrito, a versões mais novas eram a xstream-1.01 e xpp3-1.1.3.3_min respectivamente. 

    Já mandou baixar? Ótimo. Enquanto você espera o download, pode dar uma expiadinha do problema a ser ilustrado. 

    Suponha que se queira construir uma Agenda Eletrônica Pessoal. Imagine uma agenda para celular. Deseja-se facilidade, eficiência, portabilidade, integração com outros sistemas, e tal. Decide-se então guardar os contatos em XML. Esses contatos são lista de pessoas, que possuem nome, email e um telefone comercial. Esse telefone comercial contém um número para o DDD e o número local. 

    Passa isso, constrói-se as seguintes classes Java: 

    01 public class Pessoa {
    02     private String nome;
    03     private String email;
    04     private Telefone foneComercial;
    05         
    06         // métodos Setters e Getters
    07 }
    08 
    09 public class Telefone {
    10     int ddd;
    11     String numero;       
    12         // métodos Setters e Getters 
    13 }

    Ok, até aqui tudo bem. Mas e aí, como uso XStream? Tá saltando uma resposta quentinha na próxima seção. A essas horas, mesmo usando modem, é provável que já tenha terminado de baixar os arquivos. Coloque-os em seu classpath e volte aqui. 

    01 import java.util.ArrayList;
    02 import java.util.List;
    03 
    04 import com.thoughtworks.xstream.XStream;
    05 
    06 public class TesteXStream {
    07     public static void main(String[] args) {
    08         // Criando um objeto XStream        
    09         XStream xstream = new XStream();
    10 
    11         // Criando alguns dados
    12         Pessoa vinci = new Pessoa();
    13         vinci.setNome("Vinci Pegoretti Amorim");
    14         vinci.setEmail("vinci_amorim@yahoo.com.br");
    15 
    16         Telefone foneDoVinci = new Telefone();
    17         foneDoVinci.setDdd(55);
    18         foneDoVinci.setNumero("5555 5555");
    19 
    20         vinci.setFoneComercial(foneDoVinci);
    21         List contatos = new ArrayList(1);
    22         contatos.add(vinci);
    23 
    24         // Passando os dados de Objetos Java para XML
    25         String contatosEmXML = xstream.toXML(contatos);
    26 
    27         System.out.println("\nContatos em XML:");
    28         System.out.println(contatosEmXML);
    29 
    30         // Passando os dados de XML para Objetos Java
    31         List amigos = (Listxstream.fromXML(contatosEmXML);
    32         Pessoa amigo = (Pessoaamigos.get(0);
    33         Telefone foneDoAmigo = amigo.getFoneComercial();
    34 
    35         System.out.println("\nAmigo como Objeto Java:");
    36         System.out.println("Nome: " + amigo.getNome());
    37         System.out.println(
    38             "Fone Comercial: ("
    39                 + foneDoAmigo.getDdd()
    40                 ") "
    41                 + foneDoAmigo.getNumero());
    42     }
    43 }

    Primeiro é necessário importar a classe com.thoughtworks.xstream.XStream e criar um objeto para ela. Depois, deve-se implementar um código como o seguinte: 

    1    String mensagemEmXML = xstream.toXML(objetoRaiz);

    Feito isso, seus dados são passados para XML. Rodando o testeXStream espera-se obter a saída abaixo: 

    Contatos em XML: 
     
     
    vinci_amorim@yahoo.com.br 
     
    55 
    5555 5555 
     
    Vinci Pegoretti Amorim 
     
     

    Amigo como Objeto Java: 
    Nome: Vinci Pegoretti Amorim 
    Fone Comercial: (55) 5555 5555 

    Se você já conhece outras formas de mapeamento Java-XML certamente estará impressionado com a facilidade de XStream. 

    Mas algumas vezes você pode querer mapear nomes para as tags diferentes do nome da classe. Para fazer isso com XStream basta, após a criação do seu objeto da classe XStream, escrever: 

    1      xstream.alias("nomeDoObjetoEmXML", NomeDoObjetoEmJava);

    Para este caso podería-se fazer algo como: 

    1      xstream.alias("contato", Pessoa.class);
    2      xstream.alias("telefone", Telefone.class);
    3      xstream.alias("lista", ArrayList.class);

    A nova saída seria: 

    Contatos em XML: 
     
     
    vinci_amorim@yahoo.com.br 
     
    55 
    5555 5555 
     
    Vinci Pegoretti Amorim 
     
     

    Amigo como Objeto Java: 
    Nome: Vinci Pegoretti Amorim 
    Fone Comercial: (55) 5555 5555 

    Para a maioria dos casos, este conhecimento já é o suficiente. Mas uma visita ao site oficial sempre é recomendado. 

    Como nem tudo são flores, XStream possui algumas limitações. Por exemplo, o texto "Blá" e os atributos do XML abaixo são simplesmente igorados. 

    Blá 
    vinci_amorim@yahoo.com.br 
     
    31 
    3899 1994 
     
    Vinci Pegoretti Amorim 
     

    Entretando, em situações onde se tem domínio sobre a estrutura a ser usada, isso não representa grandes problemas. Vai trabalhar com XML? A sugestão é: tente usar XStream. Se não for possível, tente outra. 

    Se você entendeu como usar XStream e onde é recomendado o seu uso, a missão foi cumprida. Abraços e até a próxima.

  • Fonte : http://www.guj.com.br/java.tutorial.artigo.144.1.guj