Sie sind auf Seite 1von 5

Manipulando arquivos XML com o JDOM

Glaucio Guerra
Adaptado de [http://www.devmedia.com.br/manipulando-arquivos-xml-com-o-jdom-parte-i-escrevendo-arquivos/3330]

Parte I Escrevendo Arquivos


Neste artigo descreverei como acessar, manipular e gerar arquivos XML atravs do JDOM, uma API criada para processar XML pensando em Java. Vamos criar um exemplo simulando uma estrutura de banco de dados simples, na qual temos uma tabela, colunas e registros. Para isso precisamos definir uma estrutura de um arquivo XML:
<Agenda> <Contato id=""> <nome> </nome> <telefone></telefone> <endereco> </endereco> <email> </email> </Contato> </Agenda>

A tag Contato representa o registro da tabela Agenda. As tags nome, endereo, telefone e e-mail compem a chave Contato, representando os campos de uma tabela. A Agenda a representao do documento inteiro, tambm podendo ser chamada de root. Vale lembrar que dentro de cada arquivo XML possvel inserir apenas um elemento deste tipo. Agora vamos descrever algumas classes da API do JDOM que representar o nosso pequeno Banco de Dados. Toda tag representada pela classe org.jdom. Element. J os documentos XML so representados pela classe org.jdom.Document. No nosso caso, a tag Agenda o Document, lembrando que ela tambm um Element. Assim sendo, o cdigo ficaria da seguinte forma:
Element agenda = new Element("Agenda"); Document myDocument = new Document(agenda);

Tambm precisamos definir um atributo chamado id para a tag Contato para identificarmos os dados de uma determinada pessoa fsica, por exemplo. Confira o cdigo:
Element contato = new Element("Contato"); contato.setAttribute("id","123");

Vamos atribuir valores as tags que compe Contato:


Element nome = new Element("nome"); nome.setText("Glaucio Guerra");

Element telefone = new Element("telefone"); telefone.setText("123-456"); Element endereco = new Element("endereco"); endereco.setText("Av. Amaral Peixoto S/N"); Element email = new Element("email"); email.setText("glaucioguerra@gmail.com");

Agora vamos adicionar os elementos pertencentes tag Contato:


contato.addContent(nome); contato.addContent(telefone); contato.addContent(endereco); contato.addContent(email);

Finalmente vamos adicionar tag Contato a Agenda:


agenda.addContent(contato);

Para imprimir o arquivo que ns criamos, precisamos de um XMLOutputter. Esta classe recebe como parmetro um OutputStream ou um Writer. Vamos exibir o arquivo na sada padro, por exemplo:
XMLOutputter xout = new XMLOutputter(); try { xout.output(documento, System.out); } catch (IOException e) { e.printStackTrace(); }

Agora vamos criar o arquivo propriamente dito:


try { FileWriter arquivo = new FileWriter(new File("c:/arquivo.xml")); xout.output(documento, arquivo); } catch (IOException e) { e.printStackTrace(); }

Segue o cdigo completo abaixo:


package br.com.artigos.jdom; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.XMLOutputter;

public class Main { public static void main(String[] args) { Element agenda = new Element("Agenda"); //Define Agenda como root Document documento = new Document(agenda); //Cria o elemento Contato Element contato = new Element("Contato"); //Adiciona o atributo id ao Contato contato.setAttribute("id","123"); //Criando os elementos de contato Element nome = new Element("nome"); nome.setText("Glaucio Guerra"); Element telefone = new Element("telefone"); telefone.setText("123-456"); Element endereco = new Element("endereco"); endereco.setText("Av. Amaral Peixoto S/N"); Element email = new Element("email"); email.setText("glaucioguerra@gmail.com"); //Adicionando elementos nome, telefone, endereco e email no Contato contato.addContent(nome); contato.addContent(telefone); contato.addContent(endereco); contato.addContent(email); //Adicionado o Contato a Agenda agenda.addContent(contato); //Classe responsvel para imprimir / gerar o XML XMLOutputter xout = new XMLOutputter(); try { //Criando o arquivo de saida FileWriter arquivo = new FileWriter(new File("c:/arquivo.xml")); //Imprimindo o XML no arquivo xout.output(documento, arquivo); } catch (IOException e) { e.printStackTrace(); } } }

Abaixo segue o arquivo gerado:


<?xml version="1.0" encoding="UTF-8" ?> <Agenda> <Contato id="123"> <nome>Glaucio Guerra</nome> <telefone>123-456</telefone> <endereco>Av. Amaral Peixoto S/N</endereco> <email>glaucioguerra@gmail.com</email> </Contato> </Agenda>

Parte II Lendo Arquivos


Vamos utilizar um parser para analisar o XML. Este parser o SAXBuilder, que ser utilizado para processar a estrutura do documento para dentro de uma varivel do tipo Document. O mtodo utilizado para processar o XML o build, que recebe como parmetro o caminho do arquivo. Abaixo segue o cdigo:
Document doc = null; SAXBuilder builder = new SAXBuilder(); try { doc = builder.build("c:/arquivo.xml"); } catch (Exception e) { e.printStackTrace(); }

Agora que o documento j est processado, ns precisamos fazer uma iterao dos elementos a partir do root e exibi-los na tela. Abaixo segue o cdigo:
Element agenda = doc.getRootElement();

Depois de selecionar o elemento root, vamos criar uma lista com os filhos do elemento root. A partir desta lista faremos a iterao e a recuperao dos elementos. Segue o cdigo:
List<Element> lista = agenda.getChildren(); for (Element e: lista ){ System.out.println("Contato: "+ e.getAttributeValue("id")); System.out.println("Nome: " + e.getChildText("nome")); System.out.println("Telefone: " + e.getChildText("telefone")); System.out.println("Endereo: " + e.getChildText("endereco")); System.out.println("E-mail: " + e.getChildText("email")); }

Abaixo segue o cdigo completo:


package br.com.artigos.jdom;

import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder;

public class Main { @SuppressWarnings("unchecked") public static void main(String[] args) { Document doc = null; SAXBuilder builder = new SAXBuilder(); try { doc = builder.build("c:/arquivo.xml"); } catch (Exception e) { e.printStackTrace(); } Element agenda = doc.getRootElement(); List<Element> lista = agenda.getChildren(); for (Element e: lista ){ System.out.println("Contato: "+ e.getAttributeValue("id")); System.out.println("Nome: " + e.getChildText("nome")); System.out.println("Telefone: " + e.getChildText("telefone")); System.out.println("Endereo: " + e.getChildText("endereco")); System.out.println("E-mail: " + e.getChildText("email")); } } }

Como o valor de contato um Atributo, a forma que temos para acessar este membro diferente de todas as outras. De acordo com o exemplo acima, a funo seria e.getAttributeValue() e no e.getChildText(). Outro item que deve ser observado so as excees lanadas pelo build da classe SaxBuilder. No caso exibido, foi generalizada a Exception. No entanto, existem pelo menos duas excees a serem tratadas de forma mais especifica: a IOException e a JDOMException.

Das könnte Ihnen auch gefallen