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.