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.
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.
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); }
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 Listtelefones = 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.
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); Collectiontelefones = 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 http://www.jdom.org/docs/apidocs/index.html
- Download da biblioteca JDOM http://www.jdom.org/downloads/index.html
- Site oficial JDOM http://www.jdom.org/index.html