sexta-feira, 5 de junho de 2015

Transformando XML em objetos Java com XStream

Olá amigos do Preciso Estudar Sempre, meu nome é João Paulo e minha paixão é estudar. Hoje falaremos sobre a transformação de XML em objetos Java. Para realizar essa transformação usaremos um framework chamado XStream. Esse framework facilita muito essa transformação, necessitando apenas de um Java Bean onde, a classe representará uma tag de maior nível e seus atributos representarão tag aninhadas.

Não entendeu !? Ficou confuso !? Calma, vou explicar melhor e vou explicar na prática.

Seeeeeee você está ansiosinho para fazer download do projeto, clique aqui.

Nossa situação é: precisamos ler de um arquivo XML os dados de um funcionário de uma empresa.

Para podermos trabalhar, precisaremos criar um projeto Maven. Não irei restringir qual tipo de projeto maven que você deve usar desde que, seja possível adicionar uma dependência no pom.xml e criar uma classe java.

Crie uma workspace e um projeto maven, adicione esta dependência no seu pom.xml.

 <dependency>  
      <groupId>com.thoughtworks.xstream</groupId> 
      <artifactId>xstream</artifactId> 
      <version>1.4.8</version> 
 </dependency> 

Crie o arquivo funcionario.xml em um lugar de preferência sua.

 <funcionario>  
      <nome>João Paulo</nome> 
      <email>meuemail@gmail.com</email> 
      <dtNascimento>28/03/1990</dtNascimento> 
      <cargo>Programador Java Senior</cargo> 
      <matricula>PGR 0001</matricula> 
      <telefones> 
           <telefone>2128906678</telefone> 
           <telefone>21988674322</telefone> 
           <telefone>21956099876</telefone> 
      </telefones> 
 </funcionario> 

Agora, crie a classe Funcionario.

 package XStreamProject.XStreamProject;  

 import java.util.Date; 
 import java.util.List; 

 public class Funcionario { 
      private String nome; 
      private String email; 
      private Date dtNascimento; 
      private String cargo; 
      private String matricula; 
      private List<Long> telefones; 

      public String getNome() { 
           return nome; 
      } 

      public void setNome(String nome) { 
           this.nome = nome; 
      } 

      public String getEmail() { 
           return email; 
      } 

      public void setEmail(String email) { 
           this.email = email; 
      } 

      public Date getDtNascimento() { 
           return dtNascimento; 
      } 

      public void setDtNascimento(Date dtNascimento) { 
           this.dtNascimento = dtNascimento; 
      } 

      public String getCargo() { 
           return cargo; 
      } 

      public void setCargo(String cargo) { 
           this.cargo = cargo; 
      } 

      public String getMatricula() { 
           return matricula; 
      } 

      public void setMatricula(String matricula) { 
           this.matricula = matricula; 
      } 

      public List<Long> getTelefones() { 
           return telefones; 
      } 

      public void setTelefones(List<Long> telefones) { 
           this.telefones = telefones; 
      } 
 } 

Crie a classe XMLToObject.java.

 package XStreamProject.XStreamProject;  

 import java.io.File; 
 import java.util.List; 
 import com.thoughtworks.xstream.XStream; 
 import com.thoughtworks.xstream.converters.basic.DateConverter; 

 public class XMLToObject { 

      public static void main(String[] args) { 
           new XMLToObject().transformXMLToObject(); 
      } 

      private void transformXMLToObject(){ 
           File nossoArquivoXML = new File("C://arquivos//funcionario.xml"); 
           XStream xStream = new XStream(); 

           /*configuracao*/ 
           xStream.alias("funcionario", Funcionario.class); 
           xStream.registerConverter(new DateConverter("dd/MM/yyyy", null)); 
           xStream.alias("telefones", List.class); 
           xStream.alias("telefone", Long.class); 
           Funcionario funcionario = (Funcionario) xStream.fromXML(nossoArquivoXML); 
           this.printReport(funcionario); 
      } 

      private void printReport(Funcionario funcionario){ 
           System.out.println("--- Relatório do funcionário ---"); 
           System.out.println("Nome: " + funcionario.getNome()); 
           System.out.println("Email: " + funcionario.getEmail()); 
           System.out.println("Data de nascimento: " + funcionario.getDtNascimento()); 
           System.out.println("Cargo: " + funcionario.getCargo()); 
           System.out.println("Matrícula: " + funcionario.getMatricula()); 
           if(!funcionario.getTelefones().isEmpty()){ 
                System.out.println("Telefones: "); 
                for (Long phone : funcionario.getTelefones()) { 
                     System.out.println("\t" + phone); 
                }           
           } 
      } 
 } 

Agora que já codificamos tudo, vamos entender o que escrevemos.

Nós temos três métodos, o primeiro é banal, é o nosso velho amigo main o qual, já conhecemos muito bem. O último método serve somente para imprimir os dados que foram obtidos através do XML, não devemos focar nossa atenção nele. Porém, o segundo método é o mais importante dos três e por isso foi deixado por último.

Nesse método criamos uma referência para o arquivo XML e instanciamos o XStream. Logo após isso, definimos os alias e registramos um converter. Os alias servem para dizer ao XStream que tipo é o dado que estamos tentando ler. Se isso não for feito, ele tentará atribuir uma String ao atributo mapeado o que, ocasionará em um erro de conversão. Não sei se você notou mas, mas os aliases só foram realizados nos dados que não são String.

O converter foi registrado porque, no XML a data de nascimento está no formato dd/MM/yyyy e o XStream não entende esse formato. Ele tem como formato padrão o yyyy-mm-dd hh:mm:ss e uma lista de padrões alternativos que seguem o padrão default. Se não tivéssemos registrado o converter, o XStream iria propagar um erro de conversão de dados.

Agora a parte mais importante de todo nosso estudo, a transformação dos dados. O XStream deixa isso muito simplificado através do método fromXML o qual, recebe a referência do nosso arquivo XML e usa as configurações feitas, ambas acima. O casting é feito porque esse método retorna um Object.

Pronto !! Você já tem tudo o que precisa para transformar dados de um XML em um objeto.

Para baixar o projeto, clique aqui.

Sugestões ?! Críticas ?! Elogios ?!

Deixe aí nos comentários ou na nossa página do facebook.


Referências:
Serializing Java Objects with XStream - http://www.xml.com/lpt/a/1462

Nenhum comentário: