publicidade
XStream: Trabalhando com facilmente XML em Java

XStream: Trabalhando com facilmente XML em Java

by Anderson 17. April 2009 15:15
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.

Caminhos para trabalhar com Java e XML

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.
    Exemplo passo a passo
    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:
    1. public class Pessoa {   
    2.     private String nome;   
    3.     private String email;   
    4.     private Telefone foneComercial;   
    5.            
    6.         // métodos Setters e Getters   
    7. }   
    8.   
    9. 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.
    Exemplo passo a passo

    1. import java.util.ArrayList;   
    2. import java.util.List;   
    3.   
    4. import com.thoughtworks.xstream.XStream;   
    5.   
    6. public class TesteXStream {   
    7.     public static void main(String[] args) {   
    8.         // Criando um objeto XStream           
    9.         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 = (List) xstream.fromXML(contatosEmXML);   
    32.         Pessoa amigo = (Pessoa) amigos.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:
    1. Contatos em XML:   
    2. <list>   
    3.   <Pessoa>   
    4.     <email>vinci_amorim@yahoo.com.br</email>   
    5.     <foneComercial class="Telefone">   
    6.       <ddd>55</ddd>   
    7.       <numero>5555 5555</numero>   
    8.     </foneComercial>   
    9.     <nome>Vinci Pegoretti Amorim</nome>   
    10.   </Pessoa>   
    11. </list>   
    12.   
    13. Amigo como Objeto Java:   
    14. Nome: Vinci Pegoretti Amorim   
    15. Fone Comercial: (555555 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:
    1. Contatos em XML:   
    2. <lista>   
    3.   <contato>   
    4.     <email>vinci_amorim@yahoo.com.br</email>   
    5.     <foneComercial>   
    6.       <ddd>55</ddd>   
    7.       <numero>5555 5555</numero>   
    8.     </foneComercial>   
    9.     <nome>Vinci Pegoretti Amorim</nome>   
    10.   </contato>   
    11. </lista>   
    12.   
    13. Amigo como Objeto Java:   
    14. Nome: Vinci Pegoretti Amorim   
    15. Fone Comercial: (555555 5555  

    Para a maioria dos casos, este conhecimento já é o suficiente. Mas uma visita ao site oficial sempre é recomendado.
    Conclusões
    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.
    1. <pessoa id="5" sexo="masculino"> Blá   
    2.   <email>vinci_amorim@yahoo.com.br</email>   
    3.   <foneComercial>   
    4.     <ddd>31</ddd>   
    5.     <numero>3899 1994</numero>   
    6.   </foneComercial>   
    7.   <nome>Vinci Pegoretti Amorim</nome>   
    8. </pessoa>  

    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:www.guj.com.br - Vinci Pegoretti Amorim

    Tags: , ,

    Linguagens de programação | Java | Artigos | Linguagens de programação | Java | Artigos

    Comments

    Add comment


    (Will show your Gravatar icon)

      Country flag

    biuquote
    • Comment
    • Preview
    Loading



    Powered by BlogEngine.NET 1.5.0.7
    Theme by Mads Kristensen

    Compartilhe aqui!

    .


    Compartilhe

    Anderson Damasio

    Desenvolvedor Java e .Net C# atuando na área desde 2004.

    Tags para Pesquisa

    Seja um membro