Manipulando arquivos XML com o JDOM – Parte I – Escrevendo Arquivos

 

Neste artigo descreverei como acessar, manipular e gerar arquivos XML através 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, endereço, telefone e e-mail compõem a chave Contato, representando os campos de uma tabela. A Agenda é a representação do documento inteiro, também podendo ser chamada de root. Vale lembrar que dentro de cada arquivo XML é possível 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 são representados pela classe org.jdom.Document. No nosso caso, a tag Agenda é o Document, lembrando que ela também é um Element. Assim sendo, o código ficaria da seguinte forma:

 

Element agenda = new Element("Agenda");

Document myDocument = new Document(agenda);

 

Também precisamos definir um atributo chamado id para a tag Contato para identificarmos os dados de uma determinada pessoa física, por exemplo. Confira o código:

 

Element contato = new Element("Contato");

contato.setAttribute("id","123");

 

Vamos atribuir valores as tags que compõe 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 nós criamos, precisamos de um XMLOutputter. Esta classe recebe como parâmetro um OutputStream  ou um Writer. Vamos exibir o arquivo na saída padrão, 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 código 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 responsável 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>

 

Podemos ter diversos contatos em uma Agenda. Segue o exemplo em que nós vamos inserir cinco contatos:

 

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

           

            for (int i=0;i<5;i++){

                  Element contato = new Element("Contato");

                  //Adiciona o atributo id ao Contato

                  contato.setAttribute("id",Integer.toString(i));

                  //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 os elementos nome, telefone,

                  //endereco e email em Contato

                  contato.addContent(nome);

                  contato.addContent(telefone);

                  contato.addContent(endereco);

                  contato.addContent(email);

                  //Adicionado o Contato a Agenda

                  agenda.addContent(contato);

            }

            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 a saída:

 

  <?xml version="1.0" encoding="UTF-8" ?>

<Agenda>

               <Contato id="0">

<nome>Glaucio Guerra</nome>

<telefone>123-456</telefone>

<endereco>Av. Amaral Peixoto S/N</endereco>

<email>glaucioguerra@gmail.com</email>

            </Contato>

               <Contato id="1">

<nome>Glaucio Guerra</nome>

<telefone>123-456</telefone>

<endereco>Av. Amaral Peixoto S/N</endereco>

<email>glaucioguerra@gmail.com</email>

            </Contato>

<Contato id="2">

                        <nome>Glaucio Guerra</nome>

<telefone>123-456</telefone>

<endereco>Av. Amaral Peixoto S/N</endereco>

<email>glaucioguerra@gmail.com</email>

</Contato>

<Contato id="3">

                        <nome>Glaucio Guerra</nome>

<telefone>123-456</telefone>

                        <endereco>Av. Amaral Peixoto S/N</endereco>

                        <email>glaucioguerra@gmail.com</email>

</Contato>

<Contato id="4">

                        <nome>Glaucio Guerra</nome>

<telefone>123-456</telefone>

                        <endereco>Av. Amaral Peixoto S/N</endereco>

                        <email>glaucioguerra@gmail.com</email>

</Contato>

</Agenda>

 

Leia também