segunda-feira, 10 de outubro de 2011

JAXB - Solução de manipulação em XML

JAXB - Solução para manipulação de XML com java.
Site oficial JAXB.
Abaixo apresentaremos um exemplo de manipulação de arquivos XML.
A biblioteca Jaxb consiste nos métodos de marshal e unmarshal.
Estes dois métodos são acessíveis respectivamente pelas classes javax.xml.bind.Marshaller e javax.xml.bind.Unmarshaller.
Marshal é responsável por transformar um objeto java em xml.
Unmarshal é responsável por preencher os dados do xml para o objeto java.
Para exemplificar a utilização do Jaxb, faremos um exemplo bem simples que utilizará 4 arquivos.
UtilXML - Arquivo que conterá os métodos responsáveis por ler, escrever e outros.
ConteudoHomeXML - Arquivo que conterá os dados raiz do xml.
ListaConteudosHome - Arquivo que conterá os dados do objeto raiz, ou seja, a lista do objeto.
TesteXML - Arquivo que conterá o atributo main para a execução de nossa estrutura.

Tudo isto será possível por algumas anotações:

Anotações do ConteudoHomeXML:
@XmlRootElement(name = "conteudoHome")
Anotação que identificará o nome da tag raiz ou seja elemento root.
@XmlType(propOrder = { "idConteudoHome", "pathImagem", "titulo", "textoResumo","texto","linkURL" })
Anotação que irá identificar os nomes de cada atributo java deverá sair no arquivo xml, ou seja, os nomes de propriedades do xml.
Anotações do ListaConteudosHome.

@XmlElementWrapper(name = "listConteudoHome")

Anotação que irá identificar que o atributo java que conterá a lista de objetos.
@XmlElement(name = "conteudoHome")
Anotação que irá identificar o elemento contido na lista.



Classe para manipular XML.

package br.org.fieg.interagy.util.xml;


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class UtilXml {

@SuppressWarnings("unused")
public static final String DIRETORIO_ARQUIVOS_XML = "c:\temp\";
public static final String CAMINHO_ARQUIVO_CONTEUDO = DIRETORIO_ARQUIVOS_XML+"conteudoHome.xml";
public static final String CAMINHO_ARQUIVO_OFERTA = DIRETORIO_ARQUIVOS_XML+"ofertaHome.xml";

private static UtilXml utilXml;

private UtilXml(){ }

public static UtilXml getInstance() {
if (utilXml == null){
utilXml = new UtilXml();
}
return utilXml;
}

public void escreverXml(Marshaller m, Object conjuntoAnuncio) throws JAXBException {
escreverXml(m, conjuntoAnuncio, CAMINHO_ARQUIVO_CONTEUDO);
}

public void escreverXml(Marshaller m, Object conjuntoAnuncio, String caminhoArquivo) throws JAXBException {
Writer w = null;
try {
w = new FileWriter(caminhoArquivo);
m.marshal(conjuntoAnuncio, w);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
w.close();
} catch (Exception e) {
}
}
}

public <B>B lerXml(JAXBContext context, Class<B> c) throws JAXBException, FileNotFoundException {
return lerXml(context, c, CAMINHO_ARQUIVO_CONTEUDO);
}

@SuppressWarnings("unchecked")
public <B>B lerXml(JAXBContext context, Class<B> c, String caminhoArquivo) throws JAXBException, FileNotFoundException {
// pega as variaveis do nosso xml
Unmarshaller um = context.createUnmarshaller();
return (B) um.unmarshal(new FileReader(caminhoArquivo));
}

public Marshaller factoryMarshaller(Class<?> class1) throws JAXBException {
// criar JAXB context and instancia marshaller
Marshaller m = factoryJAXBContext(class1).createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
return m;
}

public JAXBContext factoryJAXBContext(Class<?> class1) throws JAXBException {
JAXBContext context;
context = JAXBContext.newInstance(class1);
return context;
}
}

Arquivo XML raiz

package br.com.sitez.util.xml;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.apache.commons.lang.StringUtils;

import br.com.sitez.util.UtilArquivo;

@XmlRootElement(name = "conteudoHome")
@XmlType(propOrder = { "idConteudoHome", "pathImagem", "titulo", "textoResumo","texto","linkURL" })
public class ConteudoHomeXML {

private int idConteudoHome;
private String pathImagem;
private String titulo;
private String textoResumo;
private String texto;
private String linkURL;

// Se voce deseja uma variavel, voce pode facilmente mudar o nome para seu xml-output
@XmlElement(name = "id")
public int getIdConteudoHome() {
return idConteudoHome;
}
public void setIdConteudoHome(int idAnuncio) {
this.idConteudoHome = idAnuncio;
}
public String getPathImagem() {
return pathImagem;
}
public void setPathImagem(String pathImagem) {
this.pathImagem = pathImagem;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
//@XmlJavaTypeAdapter(Adapter.class)
public String getTextoResumo() {
return textoResumo;
}
public void setTextoResumo(String textoResumo) {
this.textoResumo = textoResumo;
}
public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}
public String getLinkURL() {
return linkURL;
}
public void setLinkURL(String linkURL) {
this.linkURL = linkURL;
}
}

Arquivo XML que contém a lista

package br.com.sitez.util.xml;

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

//This statement means that class "ConjuntoAnuncio.java" is the root-element of our example
@XmlRootElement(namespace = "br.com.sitez.util.xml")
public class ListaConteudosHome {

private ArrayList<ConteudoHomeXML> listConteudoHome;

// XmLElementWrapper generates a wrapper element around XML representation
@XmlElementWrapper(name = "listConteudoHome")
// XmlElement sets the name of the entities
@XmlElement(name = "conteudoHome")
public ArrayList<ConteudoHomeXML> getListConteudoHome() {
return listConteudoHome;
}

public void setListConteudoHome(ArrayList<ConteudoHomeXML> listAnuncio) {
this.listConteudoHome = listAnuncio;
}
}

Arquivo TesteXML:

package Utilitarios.test;

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

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

import br.com.sitez.util.xml.ConteudoHomeXML;
import br.com.sitez.util.xml.ListaConteudosHome;
import br.com.sitez.util.xml.UtilXml;

public class TesteXML {

public TesteXML() {}
/**
* @param args
*/
public static void main(String[] args) {
try {
ArrayList<ConteudoHomeXML> anuncios = new ArrayList<ConteudoHomeXML>();
// create anuncios
anuncios.add(setAnuncio(1,"IEL CELEBRA DIA DO ESTAGI&Aacute;RIO", 
"c:/temp/img/v2_imgEventos/dia-do-estagiario-2011/DSC_1650.jpg", 
"http://www.sitedoestagio.com.br",
"Texto resumo que dever&aacute; aparecer no anuncio.", "Texto que devera ser apresentado integralmente"));
anuncios.add(setAnuncio(2,"IEL CELEBRA DIA DO ESTAGI&Aacute;RIO", 
"c:/temp/img/v2_imgEventos/dia-do-estagiario-2011/DSC_1650.jpg"), 
"http://www.gmail.com",
"Texto resumo que dever&aacute; aparecer no anuncio.", "Texto que devera ser apresentado integralmente"));

// create lista de anuncios
ListaConteudosHome conjuntoAnuncio = new ListaConteudosHome();
conjuntoAnuncio.setListConteudoHome(anuncios);
// escreve xml
UtilXml.getInstance().escreverXml(UtilXml.getInstance().factoryMarshaller(ListaConteudosHome.class), 
conjuntoAnuncio);
// ler xml
lerXml(UtilXml.getInstance().factoryJAXBContext(ListaConteudosHome.class));
} catch (JAXBException e1) {
e1.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private static ConteudoHomeXML setAnuncio(int id, String titulo, String pathImagem, String linkUrl, String textoResumo, String texto) {
ConteudoHomeXML anuncio = new ConteudoHomeXML();
anuncio.setIdConteudoHome(id);
anuncio.setTitulo(titulo);
anuncio.setPathImagem(pathImagem);
anuncio.setLinkURL(linkUrl);
anuncio.setTextoResumo(textoResumo);
anuncio.setTexto(texto);
return anuncio;
}
private static void lerXml(JAXBContext context) throws JAXBException, FileNotFoundException {
ListaConteudosHome conjunto = UtilXml.getInstance().lerXml(context, ListaConteudosHome.class);
for (ConteudoHomeXML anuncio : conjunto.getListConteudoHome()) {
System.out.println("id ->" + anuncio.getIdConteudoHome());
System.out.println("titulo ->" + anuncio.getTitulo());
System.out.println("texto ->" + anuncio.getTexto());
System.out.println("Texto resumido ->" + anuncio.getTextoResumo());
System.out.println("Imagem ->" + anuncio.getPathImagem());
System.out.println("Link ->" + anuncio.getLinkURL());
System.out.println("--------------------------------------------------------------");
}
}
}

Simples assim.