Manipulando Arquivo XML Parte II: JDOM

Este tutorial é a segunda parte dos tutoriais que farei sobre Java e arquivos XML. Neste tutorial vou exemplificar como manipular arquivos XML com as API’s JDOM. Veremos como criar um arquivo XML e como ler este arquivo. Esta biblioteca é externa e pode ser baixada em  http://www.jdom.org/downloads/index.html, neste tutorial foi utilizada a versão JDOM-1.1.

1. Salvar arquivo

Antes de tudo, precisamos após criar o objeto XML para salvá-lo em um arquivo. Vamos então criar um método para isso. Crie uma classe MainTest e em seguida crie o método salvarArquivo(Document documento). Já irei informar neste primeiro passo todos os imports necessários.

Listagem 1. Classe MainTest, Imports e Método SalvarFile

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class MainTest {

    private static void salvarArquivo(Document doc) {
        try {
            Writer out = new OutputStreamWriter(new FileOutputStream(file));

            XMLOutputter xout = new XMLOutputter();

            xout.setFormat(Format.getCompactFormat().setEncoding("ISO-8859-1"));

            xout.output(doc, out);

            System.out.println("XML criado com sucesso!");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. Estrutura do XML

Vamos utilizar três classes para manipular os dados que serão inseridos no XML. Nosso arquivo ficara com a estrutura do XML da figura 1.

XML

Figura 1 – XML

Crie a classe Telefone, Endereco e Contato conforme a listagem 2 do tutorial Parte I. Como devem ter visto na Figura 1, teremos mais de um telefone no arquivo, então é por este motivo que foi criada uma coleção de telefones na classe Contato. Enquanto isso terá apenas um endereço no arquivo, por este motivo teremos um objeto Endereco na classe Contato.

3. Método gerarXML

Vamos gerar nosso XML a partir das classes da biblioteca JDOM. Todos os passos estão descritos nos comentários inseridos no código fonte.

Listagem 2. Método gerarXML e lerXML

public static void gerarXML(Contato contato) {
	//Criamos o elemento(tag) raiz
	Element tagContato = new Element("Contato");
	//Criamos os elementos que ficam dentro da tag raiz
	Element idContato = new Element("id");
	Element nomeContato = new Element("nome");
	Element emailContato = new Element("email");
	//Inserimos os valores as tags criadas a cima
	idContato.setText(String.valueOf(contato.getId()));
	nomeContato.setText(contato.getNome());
	emailContato.setText(contato.getEmail());
	//Inserimos na tag raiz as tags já com valores
	tagContato.addContent(idContato);
	tagContato.addContent(nomeContato);
	tagContato.addContent(emailContato);

	//Criamos a tag Endereco
	Element tagEndereco = new Element("Endereco");
	//Criamos as tags filhas de Endereco
	Element idEnd = new Element("id");
	Element logradouroEnd = new Element("logradouro");
	Element bairroEnd = new Element("bairro");
	Element cepEnd = new Element("cep");
	Element cidadeEnd = new Element("cidade");
	Element complementoEnd = new Element("complemento");
	Element numeroEnd = new Element("numero");
	//Inserimos os valores as tags criadas
	idEnd.setText(String.valueOf(contato.getEndereco().getId()));
	logradouroEnd.setText(contato.getEndereco().getLogradouro());
	bairroEnd.setText(contato.getEndereco().getBairro());
	cepEnd.setText(contato.getEndereco().getCep());
	cidadeEnd.setText(contato.getEndereco().getCidade());
	complementoEnd.setText(contato.getEndereco().getComplemento());
	numeroEnd.setText(String.valueOf(contato.getEndereco().getNumero()));
	//Inseriomos na tag Endereco as tags filhas
	tagEndereco.addContent(idEnd);
	tagEndereco.addContent(logradouroEnd);
	tagEndereco.addContent(bairroEnd);
	tagEndereco.addContent(cepEnd);
	tagEndereco.addContent(cidadeEnd);
	tagEndereco.addContent(complementoEnd);
	tagEndereco.addContent(numeroEnd);
	//Inserimos na tag raiz as tag Endereco
	tagContato.addContent(tagEndereco);

	//Criamos a tag Telefones
	Element tagFones = new Element("Telefones");
	//Inserir a lista de telefones
	for (Telefone fone : contato.getTelefones()) {
		//Criamos a tag Telefone
		Element tagFone = new Element("Telefone");
		//Criamos as tags de Telefone
		Element idFone = new Element("id");
		Element dddFone = new Element("ddd");
		Element numeroFone = new Element("numero");
		//Insere os valores de telefones nas tags referentes
		idFone.setText(String.valueOf(fone.getId()));
		dddFone.setText(String.valueOf(fone.getDdd()));
		numeroFone.setText(String.valueOf(fone.getNumero()));
		//Insere as tags de telefone na tag Telefone
		tagFone.addContent(idFone);
		tagFone.addContent(dddFone);
		tagFone.addContent(numeroFone);
		//Insere a tag Telefone na tag pai Telefones
		tagFones.addContent(tagFone);
	}
	//Insere a tag Telefones na tag raiz
	tagContato.addContent(tagFones);

	//Criamos um objeto Document
	Document doc = new Document();
	//Inserimos no elemento Document a
	// tag raiz com todas as demais tags
	doc.setRootElement(tagContato);

	//Chamamos o método para salvar no arquivo
	salvarArquivo(doc);
}

Listagem 3. Método lerXml

public static void lerXML() throws JDOMException, IOException {
	//Criamos um objeto SAXBuilder
	// para ler o arquivo
	SAXBuilder sb = new SAXBuilder();
	//Criamos um objeto Document que
	// recebe o conteúdo do arquivo
	Document doc = sb.build(file);
	//Criamos um objeto Element que
	// recebe as tags do XML
	Element elements = doc.getRootElement();
	//Criamos um objeto Contato
	// que recebe os valores
	// através de element
	Contato contato = new Contato();
	contato.setId(Integer.parseInt(elements.getChildText("id")));
	contato.setNome(elements.getChildText("nome"));
	contato.setEmail(elements.getChildText("email"));
	//Criamos um element que recebe a tag Endereco
	Element endElemet = elements.getChild("Endereco");
	//Criamos um objeto endereco
	// que recebe os valores da
	// do endElement
	Endereco endereco = new Endereco();
	endereco.setId(Integer.parseInt(endElemet.getChildText("id")));
	endereco.setBairro(endElemet.getChildText("bairro"));
	endereco.setCep(endElemet.getChildText("cep"));
	endereco.setCidade(endElemet.getChildText("cidade"));
	endereco.setComplemento(endElemet.getChildText("complemento"));
	endereco.setLogradouro(endElemet.getChildText("logradouro"));
	endereco.setNumero(Integer.parseInt(endElemet.getChildText("numero")));
	//Inserimos no objeto contato o objeto Endereco
	contato.setEndereco(endereco);
	//Criamos um lista para receber
	// os objetos Telefone
	List telefones = new ArrayList();
	//Criamos uma lista de Element
	// para receber a tag Telefones
	List fonesElement = elements.getChild("Telefones").getChildren();
	//Loop em fonesElement para
	// pegar as demais tags
	for (Element fone : fonesElement) {
		//Criamos um objeto telefone que
		// recebe os valores em
		// cada posicao de fonesElement
		Telefone telefone = new Telefone();
		telefone.setId(Integer.parseInt(fone.getChildText("id")));
		telefone.setDdd(Integer.parseInt(fone.getChildText("ddd")));
		telefone.setNumero(Integer.parseInt(fone.getChildText("numero")));
		//Adicionamos na lista de Telefones o objeto Telefone
		telefones.add(telefone);
	}
	//Adicionamos no objeto contato a
	// lista telefones
	contato.setTelefones(telefones);
	//Imprimimos na tela o conteúdo de Contato
	System.out.println( contato.toString() );
}

4. Método main

Agora iremos criar o método main para criar o objeto Contato e passá-lo por parametro por uma chamada ao método gerarXml() e em seguida ler o conteúdo salvo no arquivo através do método lerXML() e exibi-lo no console.

Listagem 4. Método main

public static void main(String[] args) {
	Telefone residencial = new Telefone();
	residencial.setId(1);
	residencial.setDdd(55);
	residencial.setNumero(32214512);

	Telefone celular = new Telefone();
	celular.setId(2);
	celular.setDdd(55);
	celular.setNumero(99879885);

	Collection telefones = new ArrayList();
	telefones.add(residencial);
	telefones.add(celular);

	Endereco endereco = new Endereco();
	endereco.setId(11);
	endereco.setLogradouro("Rua dos Javanezes");
	endereco.setBairro("Largo Zero");
	endereco.setCep("97010600");
	endereco.setCidade("Java City");
	endereco.setNumero(65);
	endereco.setComplemento("Ap.103A");

	Contato contato = new Contato();
	contato.setId(100);
	contato.setNome("Fulano da Silva");
	contato.setEmail("fulano@email.com");
	contato.setEndereco(endereco);
	contato.setTelefones(telefones);

	gerarXML(contato);
	try {
		lerXML();
	} catch (JDOMException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

Agora que criamos este método vamos executá-lo para gerar o arquivo XML e em seguida ler o conteúdo do arquivo gerado.

Conclusão

Vimos então como criar as tags XML e como inserir valores nelas, também vimos como recuperar essas informações de um arquivo. Utilizamos a biblioteca JDOM para isto e em comparação com o tutorial Parte I, onde usávamos apenas a API nativa do JDK, vimos que reduzimos muito o código fonte para gerar o mesmo XML.

No próximo tutorial, a Parte III, veremos como gerar e ler XML através de mais uma biblioteca externa, desta vez veremos as facilidades da biblioteca XStream.

Saiba mais

Documentação das classes do pacote org.jdom 

Download da biblioteca JDOM

Site oficial JDOM 

Ballem

Marcio Ballem é bacharel em Sistemas de Informação pelo Centro Universitário Franciscano em Santa Maria/RS. Tem experiência com desenvolvimento Delphi e Java em projetos para gestão pública e acadêmica. Possui certificação em Java, OCJP 6.

Você pode gostar...