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.
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.


