Manipulação de arquivos XML com JAXB – Marshaller e UnMarshaller

No post de hoje irei falar sobre JAXB(Java Architecture for XML Binding), uma API da plataforma JAVAEE que dá suporte à manipulação de objetos XML e JAVA. Auxilia na vinculação de objetos XML e JAVA. Com essa API é possível criar classes a partir de um XSD.

Para criarmos um XML a partir de um objeto java utilizamos a interface Marshaller e para transformar arquivos XML em objetos java a interface Unmarshaller.

Para este post foi criado um projeto com a seguinte estrutura.

estrutura_projeto

No post de hoje criaremos um arquivo XML a partir de um objeto java.

Crie um POJO Usuario anotado com @XMLRootElement indicando que a classe representa um elemento XML principal e @XmlAccessorType(XmlAccess.FIELD) responsável por definir onde as anotações devem ser interpretadas, neste caso nos atributos de classe.

Anote os atributos de classe com @XmlElement indicando que os mesmos são subElementos do elemento principal.

Anote o atributo de classe codigo do elemento principal Usuario com @XmlAttribute  para representar um atributo dentro do mesmo.

Um dos atributos de classe será uma lista de endereços, anotado com @XmlElement e @XmlElementWrapper para encapsular a lista.

package com.wordpress.carledwinj.projetoXML.pojo;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Usuario {

@XmlAttribute
private Long codigo;

@XmlElement
private String nome;

@XmlElement
private Long idade;

@XmlElementWrapper(name=”lista-enderecos”)
@XmlElement(name=”endereco”)
private List<Endereco> enderecos;

public Usuario() {}

public Usuario(Long codigo,String nome, Long idade, List<Endereco> enderecos) {
this.codigo = codigo;
this.nome = nome;
this.idade = idade;
this.enderecos = enderecos;
}

// getters and setters

}

Será criado também um POJO Endereco para representar endereço do Usuario . Iremos anotar este POJO com @XmlAccessorType(XmlAccess.FIELD) apenas. Não será anotado com @XMLRootElement pois não será um elemento principal.

package com.wordpress.carledwinj.projetoXML.pojo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class Endereco {

@XmlElement
private String logradouro;

@XmlElement
private String bairro;

@XmlElement
private String cidade;

@XmlElement
private String pais;

@XmlElement
private Long numero;

public Endereco() {}

public Endereco(String logradouro, String bairro, String cidade, String pais, Long numero) {
this.logradouro = logradouro;
this.bairro = bairro;
this.cidade = cidade;
this.pais = pais;
this.numero = numero;
}

// getters and setters

}

Agora será criado o bean responsável por realizar a conversão do objeto java para XML.

package com.wordpress.carledwinj.projetoXML.sessionbean;

import java.io.File;
import java.io.FileNotFoundException;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import com.wordpress.carledwinj.projetoXML.pojo.Usuario;

/**
*
* @author CarlEdwin
*
*/
@Stateless
@LocalBean
public class Marshalling {

public Marshalling() {}

public static File marshalling(Usuario usuario, String filePath) throws JAXBException, FileNotFoundException{

JAXBContext context = JAXBContext.newInstance(Usuario.class);

Marshaller marshaller = context.createMarshaller();

File file = new File(filePath);

marshaller.marshal(usuario, file);

return file;
}

}

Criaremos agora uma classe de teste para gerar o arquivo XML.

package com.wordpress.carledwinj.projetoXML.test;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBException;

import com.wordpress.carledwinj.projetoXML.pojo.Endereco;
import com.wordpress.carledwinj.projetoXML.pojo.Usuario;
import com.wordpress.carledwinj.projetoXML.sessionbean.Marshalling;

public class TestMarshaller {

public static void main(String[] args) {

List<Endereco> enderecos = new ArrayList<>();
enderecos.add(new Endereco(“Rua Santos Silva”, “Jardim Miranda”, “Americana”, “Brasil”, 343L));
enderecos.add(new Endereco(“Rua Doutor Miguel”, “Cidade das Flores”, “Osasco”, “Brasil”, 976L));

Usuario usuario = new Usuario(45L,”Marcos”, 27L, enderecos);

try {
Marshalling.marshalling(usuario, “usuario.xml”);
} catch (FileNotFoundException | JAXBException e) {
System.out.println(“Erro ao tentar gerar o xml.” );
e.printStackTrace();
}
}
}

Para realizar o teste, utilizei o WildFly 8.2.

servidor
Execute a classe teste para gerar o arquivo XML.

Já com o arquivo usuario.xml criado (localizado no classPath () do projeto, atualize o projeto para vê-lo) iremos copia-lo renomeando como novo_usuario.xml, altere os dados do usuario no arquivo copiado.

Será criada o bean de leitura de um arquivo XML e conversão para objeto java.

package com.wordpress.carledwinj.projetoXML.sessionbean;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import com.wordpress.carledwinj.projetoXML.pojo.Usuario;

/**
*
* @author CarlEdwin
*
*/
@Stateless
@LocalBean
public class UnMarshalling {

public UnMarshalling() {}

public static Usuario unMarshalling(String filePath) throws JAXBException, FileNotFoundException{

JAXBContext context = JAXBContext.newInstance(Usuario.class);

Unmarshaller unMarshaller = context.createUnmarshaller();

FileInputStream fileInputStream = new FileInputStream(filePath);

return (Usuario) unMarshaller.unmarshal(fileInputStream);
}

}

Criaremos então classe de teste de converão de arquivo XML para objeto java.

package com.wordpress.carledwinj.projetoXML.test;

import java.io.FileNotFoundException;

import javax.xml.bind.JAXBException;

import com.wordpress.carledwinj.projetoXML.pojo.Endereco;
import com.wordpress.carledwinj.projetoXML.pojo.Usuario;
import com.wordpress.carledwinj.projetoXML.sessionbean.UnMarshalling;

public class TestUnMarshalling {

public static void main(String[] args) {

try {
Usuario usuario = UnMarshalling.unMarshalling(“novo_usuario.xml”);

System.out.println(“Usuario ” );
System.out.println(“Codigo: ” + usuario.getCodigo());
System.out.println(“Nome: ” + usuario.getNome());
System.out.println(“Idade: ” + usuario.getIdade());
System.out.println(“Lista de enderecos: “);
for (Endereco endereco : usuario.getEnderecos()) {
System.out.println(” Logradouro: ” + endereco.getLogradouro() );
System.out.println(” Numero: ” + endereco.getNumero() );
System.out.println(” Bairro: ” + endereco.getBairro() );
System.out.println(” Cidade: ” + endereco.getCidade() );
System.out.println(” País: ” + endereco.getPais() +”\n” );
}

} catch (FileNotFoundException | JAXBException e) {
System.out.println(“Erro ao tentar ler arquivo xml externo.”);
e.printStackTrace();
}
}
}

Para realizar o teste, reinicie o servidor.

servidor

Execute a classe teste para gerar o arquivo XML.

De acordo com os testes realizados podemos observar que os passos para o Marshaller e UnMarshaller são simples.

O caminho para acessar o projeto na integra é https://github.com/carledwin/projetoXML .

Espero que tenham gostado.

Deixe uma opinião, sugestão ou dúvida.

Um grande abraço e até o próximo post!

Anúncios

Um comentário em “Manipulação de arquivos XML com JAXB – Marshaller e UnMarshaller

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s