Leitura de Xml usando Sax - dúvida

1 resposta
E

Olá.

Eu possuo a seguinte classe em java usada para ler um arquivo Xml.

import java.io.FileReader;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Vector;

import javax.swing.text.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

/* parseando um documento
 * sempre extender a classe para DefaultHandler
 */

public class TestSax extends DefaultHandler {
	public String s = null;
	Vector<String> v = new Vector<String>();
	
		
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		if (args.length != 1) {
            System.out.println("Error, file incorrect");
            System.exit(0);
        }
		XMLReader parser = XMLReaderFactory.createXMLReader();
		TestSax handler = new TestSax();
		parser.setContentHandler(handler);
		parser.setErrorHandler(handler);
		
		//Parse do arquivo que foi passado pela linha de comando.
		//Cada arquivo que vai ser parseado deve ser colocado em um FileReader:
		for (int i = 0; i < args.length; i++) {
		    FileReader r = new FileReader(args[i]);
		    parser.parse(new InputSource(r));
		}
		//System.out.println(handler.getConteudo());
	}
	
	public TestSax() {
		super();
	}
	
    ///////////////////////////////////////////
    // Event handlers.
    ///////////////////////////////////////////
	
	public void startDocument() {
	}
	public void endDocument() {
	}
	public void startElement (String uri, String name, String qName, Attributes atts) {
		if ("".equals (uri))
			System.out.println("Start element: " + qName);
		else
			System.out.println("Start element: {" + uri + "}" + name);
		
		//Verifica se existe atributo. Caso verdadeiro, imprime o nome e valor do atributo
		    if (atts.getLocalName(0) != null) {
        //Obtem o nome do atributo (<cadastro id="01"></cadastro>). No exemplo ao lado
		//iria imprimir "id".
		    	System.out.println("Attribute: "+atts.getLocalName(0));
        //Obtem o valor do atributo. No exemplo acima iria imprimir "01"
		    	System.out.println("Value: "+atts.getValue(0));
		    }
		
		    
	}
	public void endElement (String uri, String name, String qName) {
		if ("".equals (uri))
			System.out.println("End element: " + qName);
		else
			System.out.println("End element:   {" + uri + "}" + name);
	}
	
	public void characters (char ch[], int start, int length)
    {
		
		for (int i = start; i < start + length; i++){
			s = s + ch[i];			
		}
		//Print the contents of 's' and set 's' for null
		if (s != null) {
			String temp = null;
			temp = s.substring(4, s.length());
			System.out.println("Found:"+temp);
		}
		s = null;
    }

}

Se eu rodar com o seguinte Xml:

<config>
<column name="name_csv">name_db</column>
<column login="login_csv">login_db</column>
	<column password="password_csv">password_db</column>
</config>

A classe irá imprimir o seguinte conteúdo:

Start element: config
Found:

Start element: column
Attribute: name
Value: name_csv
Found:name_db
End element: column
Found:

Start element: column
Attribute: login
Value: login_csv
Found:login_db
End element: column
Found:

Start element: column
Attribute: password
Value: password_csv
Found:password_db
End element: column
Found:

End element: config

Eu só nao entendo como ela imprime sempre um Found em branco. Já tentei de tudo e nao consigo fazer com que esse Found em branco nao apareca.

Alguém tem uma idéia???

1 Resposta

I

Experimentou imprimir o que está dentro de “s” ao invés do substring “temp” onde tu preenche o Found? Só pra ter certeza de que estais passando alguma coisa realmente. T+

Criado 12 de dezembro de 2006
Ultima resposta 14 de dez. de 2006
Respostas 1
Participantes 2