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:
- public class Pessoa {
- private String nome;
- private String email;
- private Telefone foneComercial;
-
-
- }
-
- public class Telefone {
- int ddd;
- String numero;
-
- }
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
- import java.util.ArrayList;
- import java.util.List;
-
- import com.thoughtworks.xstream.XStream;
-
- public class TesteXStream {
- public static void main(String[] args) {
-
- XStream xstream = new XStream();
-
-
- Pessoa vinci = new Pessoa();
- vinci.setNome("Vinci Pegoretti Amorim");
- vinci.setEmail("vinci_amorim@yahoo.com.br");
-
- Telefone foneDoVinci = new Telefone();
- foneDoVinci.setDdd(55);
- foneDoVinci.setNumero("5555 5555");
-
- vinci.setFoneComercial(foneDoVinci);
- List contatos = new ArrayList(1);
- contatos.add(vinci);
-
-
- String contatosEmXML = xstream.toXML(contatos);
-
- System.out.println("\nContatos em XML:");
- System.out.println(contatosEmXML);
-
-
- List amigos = (List) xstream.fromXML(contatosEmXML);
- Pessoa amigo = (Pessoa) amigos.get(0);
- Telefone foneDoAmigo = amigo.getFoneComercial();
-
- System.out.println("\nAmigo como Objeto Java:");
- System.out.println("Nome: " + amigo.getNome());
- System.out.println(
- "Fone Comercial: ("
- + foneDoAmigo.getDdd()
- + ") "
- + foneDoAmigo.getNumero());
- }
- }
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:
- 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:
- <list>
- <Pessoa>
- <email>vinci_amorim@yahoo.com.br</email>
- <foneComercial class="Telefone">
- <ddd>55</ddd>
- <numero>5555 5555</numero>
- </foneComercial>
- <nome>Vinci Pegoretti Amorim</nome>
- </Pessoa>
- </list>
-
- 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:
- xstream.alias("nomeDoObjetoEmXML", NomeDoObjetoEmJava);
Para este caso podería-se fazer algo como:
- xstream.alias("contato", Pessoa.class);
- xstream.alias("telefone", Telefone.class);
- xstream.alias("lista", ArrayList.class);
A nova saída seria:
- Contatos em XML:
- <lista>
- <contato>
- <email>vinci_amorim@yahoo.com.br</email>
- <foneComercial>
- <ddd>55</ddd>
- <numero>5555 5555</numero>
- </foneComercial>
- <nome>Vinci Pegoretti Amorim</nome>
- </contato>
- </lista>
-
- 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.
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.
- <pessoa id="5" sexo="masculino"> Blá
- <email>vinci_amorim@yahoo.com.br</email>
- <foneComercial>
- <ddd>31</ddd>
- <numero>3899 1994</numero>
- </foneComercial>
- <nome>Vinci Pegoretti Amorim</nome>
- </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
a24fe1ab-7176-48b2-b76e-dddbd619e170|0|.0