Ler XML com o ParserSAX

5 respostas
andersonlopes

Saudações a todos,

Estou tentando fazer um programa que leia XML utilizando o ParserSax, porém ao final da compilação ele gera um erro:

Exception in thread "main" java.lang.NullPointerException
at parsers.ContablilidadeParserSax.parseXml(ContablilidadeParserSax.java:44)
at main.Main.main(Main.java:15)

Pelo que eu entendi o erro acusa um valor nulo sendo que o mesmo não está.
Segue o código:

public class ContablilidadeParserSax extends DefaultHandler implements ContabilidadeParser 
{
	Double saldoFinal = 0.0;
	
	@Override
	public double parseXml(File arquivoXml) 
	{
		try
		{
			FileReader arquivoXmlLeitor = new FileReader(arquivoXml);
			InputSource arquivoEntrada = new InputSource(arquivoXmlLeitor);
			
			XMLReader xr = XMLReaderFactory.createXMLReader();
			xr.setContentHandler(this);
			xr.setErrorHandler(this);
						
			xr.parse(arquivoEntrada);
		}
		catch(IOException e)
		{
			System.out.println("Erro no acesso ao arquivo: "+arquivoXml);
			e.printStackTrace();
		}
		catch(SAXException e)
		{
			System.out.println("Erro no parsing do arquivo: "+arquivoXml);
			e.printStackTrace();
		}

		return saldoFinal;		
	}

	public void startDocument ()
	{
		System.out.println("Start document");		
		saldoFinal = null;
	}


	public void endDocument ()
	{
		System.out.println("End document");
	}


	public void startElement (String uri, String name, String qName, Attributes atts)
	{
		System.out.println("Start element: " + qName);
	}


	public void endElement (String uri, String name, String qName)
	{
		System.out.println("End element: " + qName);
	}

	public void characters (char[] chars, int start, int length)
	{
	}
}

O erro aponta para o return SaldoFinal; mas se ver acima o mesmo está declarado como Double saldoFinal = 0.0;

O Main.java está dessa forma:

package main;

import java.io.File;

import parsers.ContabilidadeParser;
import parsers.ContablilidadeParserSax;

public class Main 
{
	public static void main(String[] args) 
	{
		ContabilidadeParser parser	   = new ContablilidadeParserSax();
		File 				arquivoXml = new File("contabilidade.xml");
		
		Double saldoFinal = parser.parseXml(arquivoXml);
		
		System.out.println("O saldo final é: "+saldoFinal);
	}
}

e o XML

<?xml version="1.0" encoding="ISO8859-1"?>
<extrato>
                <movimentacao>
		<valor>230,00</valor>
		<fluxo>Entrada</fluxo>
	</movimentacao>
	<movimentacao>
		<valor>110.00</valor>
		<fluxo>Saída</fluxo>
	</movimentacao>
	<movimentacao>
		<valor>1000.00</valor>
		<fluxo>Entrada</fluxo>
	</movimentacao>
</extrato>

O que está errado?
Obrigado desde já. :)

5 Respostas

alberto_ribeiro

Boa tarde, o problema é que você mesmo está setando para null o Double…

public void startDocument ()  
{  
    System.out.println("Start document");         
    saldoFinal = null;  
}
alberto_ribeiro

Boa tarde, fiz algo parecido com o seu de uma olhada para ver se te ajuda

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ContablilidadeParserSax extends DefaultHandler {

	public String tagXml = "";

	public Double saldoFinal = 0.0;

	public double iniciaParser() {
		SAXParser parser = null;

		try {
			parser = SAXParserFactory.newInstance().newSAXParser();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}

		File arquivoXml = new File("contabilidade.xml");

		try {
			parser.parse(arquivoXml, this);
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return saldoFinal;

	}

	public void startDocument() throws SAXException {
		System.out.println("INÍCIO DOCUMENTO");
	}

	public void startElement(String nameSpace, String localName,
			String qualifiedName, Attributes attributes) throws SAXException {
		System.out.println("INÍCIO ELEMENTO <" + qualifiedName + ">");

		if (qualifiedName.equals("valor")) {
			tagXml = "valor";
		}

	}

	public void characters(char[] texto, int inicio, int tamanho)
			throws SAXException {

		if (tagXml.equals("valor")) {
			saldoFinal += new Double(new String(texto, inicio, tamanho))
						.doubleValue();
		}

	}

	public void endElement(String nameSpace, String localName,
			String qualifiedName) throws SAXException {
		System.out.println("FIM ELEMENTO </" + qualifiedName + ">");

		if (qualifiedName.equals("valor")) {
			tagXml = "";
		}
	}

	public void endDocument() throws SAXException {
		System.out.println("FIM DOCUMENTO");
	}

}

e o xml

<?xml version="1.0" encoding="UTF-8"?>
<extrato>
	<movimentacao>
		<valor>230.00</valor>
		<fluxo>Entrada</fluxo>
	</movimentacao>
	<movimentacao>
		<valor>110.00</valor>
		<fluxo>Saída</fluxo>
	</movimentacao>
	<movimentacao>
		<valor>1000.00</valor>
		<fluxo>Entrada</fluxo>
	</movimentacao>
</extrato>

e a classe main

public class Main {
	public static void main(String[] args) {
		ContablilidadeParserSax parser = new ContablilidadeParserSax();
		Double saldoFinal = parser.iniciaParser();

		System.out.println("O saldo final é: " + saldoFinal);
	}
}

Lembrando que não sei se é a melhor forma, fiz correndo, pode ter coisas que estão fora de padrão…

[]'s

andersonlopes

Quando a cabeça fica quente a gente começa a perder de vista pequenos detalhes. Realmente era o caso saldoFinal = null;
Agora eu preciso saber porque o resultado continua vindo 0.0 ao invés de somar os valores… Mas isso eu vou procurar resolver primeiro.

Muito obrigado Alberto!

[]´s

alberto_ribeiro

o que eu te passei já está somando, apenas alterei a forma que você fez, mas to usando o Sax normalmente, da uma rodada neste programa e veja que o resultado está saindo corretamente… somado…

[]'s

andersonlopes

Deu certo! Muito, muito obrigado pela ajuda… mesmo! :smiley:

Criado 27 de julho de 2009
Ultima resposta 27 de jul. de 2009
Respostas 5
Participantes 2