Boteco Digital

Lendo e escrevendo XML em Java com JDOM

JDOM é uma biblioteca que visa ser um modo simples de ler e escrever documentos XML. Vamos ver neste tutorial como criar um documento XML e como lê-lo de forma bastante simples.

Primeiramente vamos as classes chaves desta biblioteca:

Document: Esta classe representa o documento inteiro, esta classe pode ter apenas um elemento que seria o elemento raiz do documento(elemento root), comentários e outros elementos de definição.

Element: Esta classe representa um elemento do documento XML(também chamado de nó), são os elementos que compõem o documento ele pode conter outros elementos, atributos, comentários e valores.

Attribute: Esta classe representa um atributo de um elemento XML.

Vamos ao código então! Só não esqueça de baixar a biblioteca JDOM e incluí-la no seu CLASSPATH.

Document doc = new Document();
		
Element root = new Element("turma");
		
Element pessoa = new Element("pessoa");
Attribute sexo = new Attribute("sexo","Masculino");
pessoa.setAttribute(sexo);
		
Element nome = new Element("nome");
nome.setText("Rodrigo");
pessoa.addContent(nome);
		
Element sobrenome = new Element("sobrenome");
sobrenome.setText("sobrenome");
pessoa.addContent(sobrenome);
		
Element notas = new Element("notas");
pessoa.addContent(notas);
		
Element teste1 = new Element("teste1");
teste1.setText("8.3");
Element teste2 = new Element("teste2");
teste2.setText("7.8");
Element prova = new Element("prova");
prova.setText("9.2");
		
notas.addContent(teste1);
notas.addContent(teste2);
notas.addContent(prova);
		
root.addContent(pessoa);
		
doc.setRootElement(root);
		
XMLOutputter xout = new XMLOutputter();
xout.output(doc , System.out);

Na linha 1 é criado o objeto que representa o documento XML, na linha 3 é criado o elemento raiz do documento e é passado para o construtor o nome do elemento, neste caso “turma”, é dentro deste elemento que iremos inserir cada elemento XML que irá representar uma pessoa, assim, dentro do elemento “turma” pode haver um ou vários elementos “pessoa”.

Na linha 5 é criado um elemento “pessoa” e nele será inserido as informações sobre a pessoa, como o sexo que será inserido como um atributo do elemento pessoa e para isso é criado um objeto de atributo na linha 6 e passado para o construtor como parâmetros o nome do atributo e seu valor. Na linha 7 é adicionado o atributo ao elemento “pessoa”.

Na linha 9 é criado um elemento nome, é definido um valor para ele na linha 10 e adicionamos este elemento “nome” ao elemento “pessoa” utilizando o método addContent, é importante lembrar a diferença deste método com o setContent, o método addContent adiciona o elemento passado por parâmetro ao conteúdo já existente dentro do elemento pai e o método setContent irá substituir o conteúdo anterior do elemento pai se houver.

Nas linhas 13, 14 e 15 é criado e atribuído o elemento de “sobrenome” da pessoa.

Na linha 17 é criado um elemento “notas” que irá conter outros elementos, que serão as notas da pessoa.

Da linha 20 até 25 é criado três elementos(“teste1″,”teste2” e “prova”) e atribuído valores para eles. Nas linhas 27, 28 e 29 é inserido os elementos “teste1”, “teste2” e “prova”, dentro do elemento “notas”.

Na linha 31 adicionamos o elemento “pessoa” ao elemento raiz do documento(elemento “turma”) e na linha 33 é adicionado o elemento turma como elemento root do documento através do método setRootElement.

Na linha 35 é criado um objeto XMLOutputter que é responsável por gerar o XML através do método output que recebe como parâmetro o objeto do documento a ser escrito e um OutputStream onde será enviado o XML, que no caso foi utilizado a saida padrão. Também poderia criar um outro OutputStream para um arquivo como no exemplo abaixo:

 
XMLOutputter xout = new XMLOutputter();
OutputStream out = new FileOutputStream( new File("exemplo.xml"));
xout.output(doc , out);

A saida do exemplo será a seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<turma>
	<pessoa sexo="Masculino">
		<nome>Rodrigo</nome>
		<sobrenome>sobrenome</sobrenome>
		<notas>
			<teste1>8.3</teste1>
			<teste2>7.8</teste2>
			<prova>9.2</prova>
		</notas>
	</pessoa>
</turma>

Utilizando a mesma estrutura de documento XML veremos um exemplo de leitura:

File f = new File("exemplo.xml");
			
SAXBuilder builder = new SAXBuilder();
	
Document doc = builder.build(f);
			
Element root = (Element) doc.getRootElement();
		
List pessoas = root.getChildren();
			
Iterator i = pessoas.iterator();
			
while( i.hasNext() ){
		Element pessoa = (Element) i.next();
		System.out.println("Nome: " + pessoa.getChildText("nome"));
		System.out.println("Sobrenome: " + pessoa.getChildText("sobrenome"));
		System.out.println("Sexo: " + pessoa.getAttributeValue("sexo"));
		System.out.println("Nota( teste1 ): "+pessoa.getChild("notas").getChildText("teste1"));
		System.out.println("Nota( teste2 ): "+pessoa.getChild("notas").getChildText("teste2"));
		System.out.println("Nota( prova ): "+pessoa.getChild("notas").getChildText("prova"));
		System.out.println();
}

Na linha 1 é criado um objeto representando o arquivo XML a ser lido, na linha 3 é criado o objeto SAXBuilder que é responsável por converter o arquivo em um objeto do tipo Document da biblioteca JDOM.

Na linha 5 é construído o objeto Document através do método builder do SAXBuilder.

Na linha 7 é pego o elemento raiz do documento(elemento “turma”) utilizando o método getRootElement. Utilizando este objeto é chamado o método getChildren(linha 9) que retorna um objeto List com todos os elementos filhos, que no caso serão objetos pessoa.

Na linha 11 é definido um iterador para percorrer os elementos “pessoas” da lista.

Na linha 14 é utilizado a variável pessoa para armazenar cada objeto pessoa.

Na Linha 15 é utilizado o método getChildText do elemento “pessoa” que retorna o valor do elemento filho selecionado, no caso o elemento nome.

Na linha 17 é utilizado po método getAttributeValue que retorna o valor do atributo selecionado, no caso sexo.

Na linha 18 para pegar o valor do elemento “teste1” é necessário primeiro selecionar o elemento “notas” já que o elemento “teste1” se encontra dentro deste, para isso é utilizado o método getChild para somente depois utilizar o método getChildText para pegar o valor de “teste1”.

Como vimos é uma biblioteca bem simples de utilizar e quem já lidou um pouco com XML não deve ter nenhuma dificuldade.

Categorias Java
comments powered by Disqus