23 de dez de 2012

XML com JAXB


O JAXB é um framework Java para processamento de documentos XML. Com ele ó possível converter um XML direto em um bean, o que não era possível por exemplo com DOM.

O JAXB usa anotações para representar elementos, atributos e valores das tags do XML. Como a intenção aqui é apenas introduzir nos senhores, com todo o respeito, vamos à algumas dessas anotações:

  • @XmlRootElement – representa o elemento principal, ou a tag principal do XML.
  • @XmlAccessorType – define onde as anotações JAXB devem ser interpretadas, nos métodos ou atributos
  • @XmlElement – representa uma tag dentro do XML
  • @XmlElementWrapper – encapsula uma lista
  • @XmlAttribute – representa um atributo dentro de uma tag


Antes de começar a desenvolver você vai precisar das dependências:

 javax.xml.bind
 jaxb-api
 2.2.6


 com.sun.xml.bind
 jaxb-impl
 2.2.6


Supunhetamos que nosso modelo de XML seja o seguinte:

    João Borra Cueca
    24
    
        
        
    


Portanto, os beans vão ficar anotados da seguinte maneira:

Pessoa.java
package com.jaxbexample.model;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="pessoa")
@XmlAccessorType(XmlAccessType.FIELD)
public class Pessoa {
    
    @XmlElement
    private String nome;
    
    @XmlElement
    private Integer idade;
    
    @XmlElementWrapper(name="telefones")
    @XmlElement(name="telefone")
    private List telefones;

    public Integer getIdade() {
        return idade;
    }

    public void setIdade(Integer idade) {
        this.idade = idade;
    }

    public String getNome() {
        return nome;
    }

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

    public List getTelefones() {
        return telefones;
    }

    public void setTelefones(List telefones) {
        this.telefones = telefones;
    }
    
    public void addTelefone(Telefone telefone){
        if(telefones==null)
            telefones = new ArrayList();
        telefones.add(telefone);
    }
    
}

Telefone.java
package com.jaxbexample.model;

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

@XmlAccessorType(XmlAccessType.FIELD)
public class Telefone {

    @XmlAttribute(name="codArea")
    private String codArea;
    
    @XmlAttribute(name="numero")
    private String numero;

    public Telefone() {
    }

    public Telefone(String codArea, String numero) {
        this.codArea = codArea;
        this.numero = numero;
    }

    public String getCodArea() {
        return codArea;
    }

    public void setCodArea(String codArea) {
        this.codArea = codArea;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }
    
}
Marshalling: é o processo de conversão do bean em xml.

Marshallling.java
package com.jaxbexample;

import com.jaxbexample.model.Pessoa;
import com.jaxbexample.model.Telefone;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.PropertyException;

public class Marshalling {

    public static void main(String[] args) {

        try {
            
            Pessoa pessoa = new Pessoa();
            pessoa.setNome("João Borra Cueca");
            pessoa.setIdade(24);
            pessoa.addTelefone(new Telefone("12", "1234-5678"));
            pessoa.addTelefone(new Telefone("84", "5678-0123"));
            
            Writer writer = new StringWriter();
            JAXBContext context = JAXBContext.newInstance(Pessoa.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(pessoa, writer);
            
            System.out.println(writer.toString());
            
        } catch (PropertyException e) {
            e.printStackTrace();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        
    }
}

Unmarshalling: é o inverso do marshalling, conversão de xml em um bean

Unmarshilling
package com.jaxbexample;

import com.jaxbexample.model.Pessoa;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.PropertyException;
import javax.xml.bind.Unmarshaller;

public class Unmarshalling {
    
    public static void main(String[] args) {

        try {
            
            String xml = ""
                            + "Oscar Alho"
                            + "24"
                            + ""
                                + ""
                                + ""
                            + ""
                        + "";
            
            JAXBContext context = JAXBContext.newInstance(Pessoa.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            
            Pessoa pessoa = (Pessoa)unmarshaller.unmarshal(new StringReader(xml));
            
            System.out.println(pessoa.getNome());
            
        } catch (PropertyException e) {
            e.printStackTrace();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        
    }
}

O JAXB é bastante usado, principalmente em frameworks para implementação de web-services. Mas isso é assunto para um outro post.

Código Fonte: http://depositfiles.com/files/i8np23h4f

É isso ae, peixe! Aqui é Java!

4 comentários:

  1. Valeu pela sugestão. Teremos um post sobre REST com toda certeza!

    ResponderExcluir
  2. Me salvou! Estava com erro e não conseguia descobrir o que era.
    Tenho uma lista tipo a tua de telefones e faltava o @XmlElementWrapper(name="telefones").
    Grato ;D

    ResponderExcluir
  3. Vlw cara!! O melhor e mais simples que achei na net. Muito melhor do que o XStream.

    ResponderExcluir