Parseando XML com o DOM

em 26/10/2002 , por Daniel Destro
Introdução
Oi pessoal! Neste tutorial vou mostrar em um exemplo bem prático como se faz para ler um documento XML bem estruturado, com Java, jogando-se os dados dentro de uma instância de classe mapeada pelo XML. Para tanto usaremos a API DOM, disponível no JDK 1.4 da SUN. Esta API é muito mais interessante de usar do que a SAX, já que ela mapeia diretamente um XML na memória. Mas como vocês podem deduzir, o gasto de memória é alto, não aconselhado para XMLs gigantescos. Caso você não tenha java 1.4, pode utilizar algum dos parsers XML padrão DOM criados pela Apache. Como por exemplo o xerces.
O problema
Você tem um XML, e a estrutura deste XML é muito parecida com a estrutura de uma classe sua, e você quer crar objetos de acordo com esse XML. Para nosso exemplo prático vamos tomar como dados do XML o código:

Iremos mapear o XML acima para objetos da classe UsuarioGUJ, descrita pelo código Java a seguir:

Decidi definir o atributo id como int pois leva-se em conta que ele é obrigatório; já os outros atributos estão como tipos abstratos e suportam o valor null ou um valor do mesmo tipo definido. Apenas uma questão de análise do seu problema. Nosso objetivo aqui será ler o XML, e para cada item (tag) usuario encontrada no XML ele cria uma instância da classe UsuarioGUJ e informa os valores lidos do XML e então adiciona esta instância em um conjunto de objetos (Vector) compondo os usuários do guj cadastrados no XML. A classe GujXmlReader terá a responsabilidade de ler o conteúdo do arquivo XML e popular os dados da intância da classe UsuarioGUJ. É neste exato ponto deste artigo que será exemplificado o código Java para que o conteúdo do XML seja lido e populado no nosso programa.

Até aqui muti simples. Criamos a classe que irá ler o XML, e com um construtor que recebe o caminho para o arquivo que iremos ler. Vamos começar a criar o método que nos retorna o Vector de UsuarioGUJ:

Pela classe DocumentBuildFactory, você pega uma factory e depois consegue um DocumentBuilder, que vai fazer o parse do XML. Após a chamada do parser, temos um objeto do tipo Document. DocumentBuilder e a sua Factory estão no pacote javax.xml.parsers do java 1.4. Se você não tem java 1.4, vai precisar puxar um parser do apache: xerces ou xalan, e colocar o .jar no classpath. lembre de modificar o import. Essas interfaces estão no pacote org.w3c.dom. Agora é o ótimo momento para que você leia as classes do pacote org.w3c.dom. Clique aqui para a API.
Vamos pegar o elemento principal do documento, que é o , e depois explodi-lo em uma lista de nós, cada um representado um usuário!

Tendo todos os nós do XML, percorremos esses nós e começamos a pegar os dados, através dos elementos desses nós! Criamos um usuarioGUJ para cada nó e vamos colocando eles no Vector, para depois retorná-lo.

A chamada getChildTagValue retorna o texto que esta contido dentro de uma determinada tag, o método está a seguir:

Fim do reader! A gente só precisa usá-lo!
Para finalizarmos o código do nosso programa teremos mais uma classe, a CadastroUsuariosGUJ. Ela apenas lê o XML e roda o nosso programa!

Conclusão
Esta solução é trivial e não muito performática, mas funciona. Pela experiência que tive com o DOM XML eu consegui resolvi assim o meu problema para ler o conteúdo de uma estrutra em XML e popular os dados no meu aplicativo. Os arquivos supracitados estão disponíveis para download aqui. Bom, espero que este tutorial tenha sido bem proveitoso.