Criando arquivos XML no Java via DOM

A manipulação de um arquivo XML através da API DOM no Java é dada através da utilização de classes nos pacotes javax.xml.parsers e org.w3c.dom.

Mas antes, vamos entender um pouco a estrutura:

Criando arquivos

Vamos definir um objetivo, gerar um arquivo XML assim:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<empresas>
<empresa>
<nome>Nome da empresa</nome>
<ramo>Nenhum</ramo>
</empresa>
</empresas>

Beleza, agora vamos ao Java.

O Document

Para criarmos um documento XMl, precisamos utilizar a classe Document, onde é gerada pelo DocumentBuilder que por sua vez é gerada pelo DocumentBuilderFactory. Vejamos:

try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}

O Element

Através da classe Document, instanciada no objeto doc, é possível criar objetos da classe Element através do método createElement:

Element root = doc.createElement("empresas");
doc.appendChild(root);

Este objeto root pode receber outros objetos do tipo Element, ou seja, podemos criar qualquer nó dentro de outro nó indefinidamente. Como é o caso para criarmos as tags nome e ramo:

Element nome = doc.createElement("nome");
empresa.appendChild(nome);

O Text

Mas e o conteúdo? Atualmente, o nosso XML só tem tags. Mas você se lembra da estrutura? Do tipo Text? O nosso Document também pode criá-lo:

Text textoNome = doc.createTextNode("Nome da empresa");
nome.appendChild(textoNome);

O elemento completo

Para visualizarmos melhor a criação no elemento empresa, veja o código a seguir:

Element nome = doc.createElement("nome");
Text textoNome = doc.createTextNode("Nome da empresa");
nome.appendChild(textoNome);
empresa.appendChild(nome);

Seguindo exatamente a mesma idéia, podemos criar o elemento ramo:

Element ramo = doc.createElement("ramo");
Text textoRamo = doc.createTextNode("Nenhum");
ramo.appendChild(textoRamo);
empresa.appendChild(ramo);

E finalmente adicionamos nosso elemento empresa ao nó principal:

root.appendChild(empresa);

Exibindo o arquivo

Devemos utilizar a classe Transformer para transformar o nosso Document em um arquivo, mas por enquanto vamos apenas exibi-lo no console:

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(System.out));

Note que onde criamos o StreamResult, é passado como parâmetro o valor System.out, onde no caso é o console, mas pode ser passado um File, que representará o arquivo propriamente dito.

Lembre-se de capturar as excessões ParserConfigurationException, TransformerConfigurationException e TransformerException! Então temos o código completo:

try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();

Element root = doc.createElement("empresas");
doc.appendChild(root);

Element empresa = doc.createElement("empresa");

Element nome = doc.createElement("nome");
Text textoNome = doc.createTextNode("Nome da empresa");
nome.appendChild(textoNome);
empresa.appendChild(nome);

Element ramo = doc.createElement("ramo");
Text textoRamo = doc.createTextNode("Nenhum");
ramo.appendChild(textoRamo);
empresa.appendChild(ramo);

root.appendChild(empresa);

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(System.out));

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}

Após executar o programa, você verá o arquivo XML no console. Por enquanto abordei apenas a criação do XML, em outro post, irei abordar a leitura do mesmo arquivo.

Até mais.