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"); } }