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???