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

22/05/2009 | By | 14 Comments

No post anterior, você viu como funcionar a API SAX do Java.

Neste post você irá aprender como ler um documento XML utilizando a interface SAX.
Para isso, você irá precisar:

* JDK 1.4 ou superior
* Editor de texto ou uma IDE Java de sua escolha

Para este post, vamos utilizar este XML como exemplo:
dom05 Manipulando arquivos XML em Java com a API SAX   Parte II

A figura abaixo exemplifica o processo de parsear um XML com a API SAX (fonte: SUN):
javatechandxml illus3 Manipulando arquivos XML em Java com a API SAX   Parte II

O processo é bem parecido com a API DOM, ou seja, com apenas 3 passos, podemos ler um arquivo XML:

1. Criar um SAXParserFactory: este objeto cria um SAXParser
2. Criar um SAXParser: este objeto faz o parse
3. Parsear o arquivo; e o resto é “automático” (dispara os eventos).

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser(); 
parser.parse("contato.xml", this );

Agora, precisamos os método para tratar os eventos:

Primeiro vamos criar o método startDocument. Vamos apenas mostrar uma mensagem que o parse começou a ler o arquivo XML:

public void startDocument() {
	System.out.println("Iniciando a leitura do XML");
}

Vamos criar também o método endDocument, que mostra quando o parse terminou de ler o arquivo XML:

public void endDocument() {
	System.out.println("Acabou a leitura do XML");
}

Agora, vamos criar o método que trata quando o parser encontra a abertura de uma tag. Vamos aproveitar e guardar as infomações encontradas em um objeto do tipo contato, para possível uso futuro. Além disso, vamos imprimir as informações encontradas no console:

public void startElement(String uri, String localName, String tag, Attributes atributos){

	//cria um contato
	if (tag.equalsIgnoreCase(NO_CONTATO)){
		contatoTemp = new Contato();
	}

	//imprime o caminho da tag
	System.out.print("\n" + tag + ": ");
		
	//se o elemento possui atributos, imprime
	for (int i=0; i< atributos.getLength(); i++){
		System.out.print(" " + atributos.getQName(i) + "=" + atributos.getValue(i));
		if (atributos.getQName(i).equalsIgnoreCase(ATT_ID)){
			contatoTemp.setId(Integer.parseInt(atributos.getValue(i)));
		} else if (atributos.getQName(i).equalsIgnoreCase(ATT_GRAVADO)){
			contatoTemp.setGravado(atributos.getValue(i));
		}
	}

}

Vamos criar também o método que trata quando o parser encontra o final de uma tag. No caso do exemplo utilizado, quando encontramos o final de uma tag (exceto a tag contato), significa que já temos uma informação coletada, então vamos guardar essa informação no atributo do objeto Contato, e após guardar essa informação, vamos limpar o buffer para que este possa coletar uma nova informação. Se o parser encontrar o final da tag contato (), significa que o objeto já possui todas as informações necessárias, então vamos adicioná-lo numa lista de contatos:

public void endElement(String uri, String localName, String tag){

	//adiciona o contato na lista
	if (tag.equalsIgnoreCase(NO_CONTATO)){
		contatos.add(contatoTemp);
		System.out.println();
	} 
	//senão, seta os atributos do contato
	else if (tag.equalsIgnoreCase(NO_NOME)){
		contatoTemp.setNome(valorAtual.toString().trim());
	} else if (tag.equalsIgnoreCase(NO_ENDERECO)){
		contatoTemp.setEndereco(valorAtual.toString().trim());
	} else if (tag.equalsIgnoreCase(NO_TELEFONE)){
		contatoTemp.setTelefone(valorAtual.toString().trim());
	} else if (tag.equalsIgnoreCase(NO_EMAIL)){
		contatoTemp.setEmail(valorAtual.toString().trim());
	}
		
	//limpa o valor Atual
	valorAtual.delete(0, valorAtual.length()); 
}

E por último, vamos criar o método que trata quando algum caracter ou informação é encontrada pelo parser. Como este método pode ser chamado algumas vezes pelo parser, vamos guardar a informação encontrada no buffer, que assim que terminar (encontrar o final de uma tag), poderemos utilizar essa informação, como visto no método acima declarado.

public void characters(char[] ch, int start, int length) {
	System.out.print(String.copyValueOf(ch,start,length).trim());
	
	valorAtual.append(ch,start,length);

}

Viu como é simples? O importante é guardar a informação à medida que for reconhecida pelo parser, pois, se perder alguma informação, náo tem como voltar atrás, como na árvore DOM.

O código completo desse post você pode fazer o download aqui (formato projeto Eclipse)
icone download Manipulando arquivos XML em Java com a API SAX   Parte II

Até a próxima!

Nos vemos no Falando em Java 2009, dia 24 de maio (próximo domingo) em São Paulo! icon smile Manipulando arquivos XML em Java com a API SAX   Parte II

Filed in: Java, XML | Tags: , , , , ,

Comments (14)

  1. Estou adorando seus posts.

    Estou colocando links de seus posts em meu site

    http://www.selectfrom.com.br

    abcs
    Rafael

  2. Marco Aurélio

    Ótimo trabalho, bem escrito e muito útil.
    Para o meu trabalho, no entanto, precisaria fazer o parser de um strig obtido a partir de um web service. Há alguma forma de fazer isso?
    Parabéns.

    • O formato de transferência de dados do webservice é em forma de XML, mas a sua aplicação consegue pegar essa string diretamente da respota do método. É como se tivesse chamando um método normalmente.

  3. black

    legal..
    só faltou pegar nome, endereço, telefone e email, direto do xml

  4. Generics

    ae o cod funciona msm.
    vlw

  5. Everson

    olá Loiane tudo bem, esse post sobre SAX e DOM ficaram muito bons, estou buscando conhecimento dessas tecnologias, no momento tenho que criar alguns relatorios que buscam os dados na base atravez do iReport, o porém é que tem alguns campos que estão gravados em XML dai eu sei ler esses dados mais não sei como envia-los para o iReport rsrsrs se souber de algo manda pro meu e-mail vlw bjão.

  6. Flávio Pires

    Parabéns, ótimo post, posso usar p/ uma aplicação Android?

  7. ALEKSANDRO

    Olá loiane, tudo bem ?

    Você sabe me dizer se consigo usando DOM , pegar a próxima tag… te explico , tenho um xml assim :

    um monte de tag aqui
    um monte de tag aqui
    um monte de tag aqui

    um monte de tag aqui

  8. Carlos

    Sou novato em java, como faço para executar esta aplicação?
    Preciso abrir estes arquivos com o eclipse e gerar um executável?
    É possível utilizar este aplicativo em um website?
    Abraços.

    • Olá Carlos,
      VOcê pode executar pela linha de comando através dos comandos javac e java normalmente ou pode importar o projeto diretamente pelo eclipse e executar pela IDE.
      Sim, esse código pode ser executado em um servidor java web, mas é preciso modificar o código um pouco para adequar ao código web.
      []‘s

  9. Breno

    Loiane, queria te perguntar de que maneira eu posso ler um arquivo xml com tags de HTML como esse da fifa: “http://pt.fifa.com/worldcup/news/rss.xml”. Tem algumas tags que atrapalham a leitura do arquivo.

Leave a Reply

Trackback URL | RSS Feed for This Entry

VideoPokiesOnline.com is the leading Pokies - Online Casino Guide in Australia. Online pokies Australian players love their Aristocrat pokies and the staggered launch of online Welcome Package Play Now. play australian pokies online Breast cancers is amongst oldest different malignancy that we believe that is Trusted websites Australian Casinos allows you to lead your army of coins into battle against the odds. Free Online Pokies at Top Rated Australian Online Casinos.
Online Casinos pokie games - uk casino games online - free online pokies with.
Slots and enjoy: ?one of a kind VIP program ? $500 Welcome Package ? Online Pokies Australia online casinos and land parlors. Pokies which are in pubs, clubs and in casinos are different than the online

Online Slots Wild Jack.