Manipulando arquivos XML em Java com a API SAX – Parte I

21 May 2009
3 mins read

O padrão SAX cresceu a partir do método DOM, que era muito complexo e inadequado para várias aplicações. Além disso, até então, cada parser XML para Java tinha seu próprio padrão de interface. Originalmente a API SAX foi desenvolvida para o ambiente Java. SAX foi a primeira interface totalmente adaptada para XML. Atualmente SAX tornou-se um padrão de fato e as suas versões mais recentes estão disponíveis para vários outros ambientes de programação.

API SAX é um mecanismo serial e orientado a eventos, que faz o acesso de elemento a elemento do documento XML a ser processado. Processadores XML, que implementam a interface SAX, geram eventos à medida que encontram elementos, atributos ou textos no documento. Existem eventos para início de elemento, término de elemento, atributos, conteúdo de textos, entidades, entre outros. As aplicações, que utilizam a interface SAX, precisam escutar estes eventos e fazer o relacionamento da sua própria estrutura de dados com a estrutura do XML.

Como SAX funciona:
- Quando você criar um parser SAX, o parser te comunica (gera um evento) quando acha algum nó no documento XML.
- O SAX não constrói uma árvore na memória com o conteúdo do arquivo XML. Quando encontra algum nó no XML, te comunica e você decide o que fazer com aquela informação.
- Um parser SAX não cria nenhum objeto. Você tem a opção de criar os objetos que você quer, mas é sua decisão, e não do parser.
- SAX começa a enviar os eventos na mesma hora que faz o parser do documento. Você não precisa esperar o parser terminar de ler o arquivo por inteiro.

Eventos SAX

A API SAX define uma série de eventos. O seu trabalho é escrever código que responda ou trate esses eventos. Se você não tratar algum evento, o parser descarta-o, e você não precisa se preocupar sobre o uso de memória e objetos, como fazia com DOM.

Os eventos em SAX são definidos como métodos anexados às interfaces Java específicas. Uma aplicação implementa alguns destes métodos e é registrada como um manipulador de evento com o parser.
O modelo SAX agrupa seus eventos em algumas interfaces:

Numa aplicação de XML baseada no SAX, você irá gastar mais tempo tratando 5 eventos básicos:

Exemplo SAX e XML

Vamos pegar o XML abaixo como exemplo:

dom04

Os métodos chamados neste exemplo são os seguintes em ordem:

  1. statDocument()
  2. startElement chamado com name="exemplo" e attrib contendo um único valor para id
  3. startElement chamado com name="no_de_texto"
  4. characters chamado uma ou mais vezes com o conteúdo "Olá mundo"
  5. endElement chamado com name=”no_de_texto”
  6. endElement chamado com name=”exemplo”
  7. endDocument()

O problema da programação em SAX é que o programador tem apenas uma passada para fazer o que precisa. Caso se esteja procurando no_de_texto que contem o valor “Hello World”, por exemplo, quando o programador detectou a palavra, o elemento exemplo (assim como o valor do id) já havia passado, se ele não guardou o id do exemplo em algum lugar, não tem volta.

A interface SAX pode ser utilizada por aplicações que têm a necessidade de processar os documentos XML de modo sequencial. Esta interface é também mais indicada para aplicações do lado servidor (que processam muitos documentos simultaneamente) ou aplicações que não suportam a representação em memória de todo o documento XML.

E no próximo post sobre a série, um passo a passo em java de como manipular um documento XML utilizando a interface SAX.

Até a próxima!

:)