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.