“Parseando” XML com JAXB

Trabalhar com xml não é uma tarefa muito agradável, mas no mundo java existe alguns projetos que facilitam essa manipulação, uma delas é o JAXB, que segue o JCP e na versão 2.0+ está sendo desenvolvida na JSR -222, ou seja é uma api bem madura e confiavel. Segue a baixo um exemplo de como fazer o parser de um xml utilizando JABX

Adicionar a dependencia no pom
pom.xml

<dependency>
    <groupI>com.sun.xml.bind</groupI>
    <artifactI>jaxb-impl</artifactI>
    <version>2.2.5</version>
</dependency>

Criar um xml com 2 atributos nome e valor
teste.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes">
<testeXml>
    <nome>Teste</nome>
    <valor>10</valor>
</testeXml>

A baixo a criação de uma classe genérica que recebe o local do arquivo e a classe que representa o Xml:
XmlUtil.xml

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;

public final class XmlUtil {

 private XmlUtil() {}

 public static <T> T ler(String pathArquivo, Class<T> type) 
           throws JAXBException {

    final File file = new File(pathArquivo);
    final JAXBContext jaxbContext = JAXBContext.newInstance(type);
    final Unmarshaller jaxbUnmarshaller  
             = jaxbContext.createUnmarshaller();

    return (T) jaxbUnmarshaller.unmarshal(file);
  }
}
  • new File(pathArquivo): cria o arquivo de acordo com o caminho;
  • JAXBContext.newInstance(type): Cria o contexto do JAXB de acordo com a classe vinda por parametro;
  • jaxbContext.createUnmarshaller(): cria uma classe utilitária que manipular xmls já existentes;
  • jaxbUnmarshaller.unmarshal: “parsea”(lê) o xml através de um arquivo(xml) e retorna a classe xml;

Classe que represent ao Xml
TesteXml.java

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

@XmlRootElement
public class TesteXml {

    private String nome;
    private String valor;

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

    @XmlElement
    public void setValor(String valor) {
        this.valor = valor;
    }

    public String getNome() {
        return nome;
    }


    public String getValor() {
        return valor;
    }
}
  • @XmlRootElement: Define que a classe é um xml
  • @@mlElement: define que o atributo é um atributo do xml por exemplo: Teste

Abaixo o teste para validar a leitura do teste.xml
XmlUtilTest.java

@RunWith(JUnit4.class)
public class XmlUtilTest {

    @Test
    public void ler() throws JAXBException {
      final TesteXml xml = XmlUtil.ler(System.getProperty("user.dir")
                + "/src/test/java/xml/teste.xml", TesteXml.class);

      Assert.assertNotNull(xml);
      Assert.assertEquals(xml.getNome(), "Teste");
      Assert.assertEquals(xml.getValor(), "10");
    }

}
Anúncios

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 )

Foto do Google+

Você está comentando utilizando sua conta Google+. 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 )

w

Conectando a %s