Por que eu devo ler este artigo: 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>