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 saída 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 saída 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 por 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.