PDA

View Full Version : java e XML


Icedguardian
05-08-2003, 15:03
Ho fatto un piccolo prog in java che legge un file XML
solo che:

SAX parser utilizzato e' validante
Parser e': org.apache.xerces.jaxp.SAXParserImpl@127734f

Inizio parsing del file degli accounts
AccountUtente{AccountSAXHandler.startDocument()}
AccountUtente{AccountSAXHandler.startElement()}: <accounts>
AccountUtente{AccountSAXHandler.startElement()}: <account>
AccountUtente{AccountSAXHandler.startElement()}: <utente>
AccountUtente{AccountSAXHandler.startElement()}: <login>
AccountUtente{AccountSAXHandler.endElement()}: </login>
AccountUtente{AccountSAXHandler.startElement()}: <password>
AccountUtente{AccountSAXHandler.endElement()}: </password>
AccountUtente{AccountSAXHandler.startElement()}: <nome>
AccountUtente{AccountSAXHandler.endElement()}: </nome>
AccountUtente{AccountSAXHandler.startElement()}: <cognome>
AccountUtente{AccountSAXHandler.endElement()}: </cognome>
AccountUtente{AccountSAXHandler.endElement()}: </utente>
AccountMail.setSSL: false
AccountMail.setDeleteMail: true
AccountUtente{AccountSAXHandler.startElement()}: <mailAccount>
AccountUtente{AccountSAXHandler.startElement()}: <mailHost>
AccountMail.setHost: popmail.libero.it
AccountUtente{AccountSAXHandler.endElement()}: </mailHost>
AccountUtente{AccountSAXHandler.startElement()}: <mailLogin>
AccountMail.setLogin: quellocheč
AccountUtente{AccountSAXHandler.endElement()}: </mailLogin>
AccountUtente{AccountSAXHandler.startElement()}: <mailPassword>
AccountMail.setPassword: quellochetipare
AccountUtente{AccountSAXHandler.endElement()}: </mailPassword>
java.lang.NullPointerException
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:969)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:345)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:281)
at AccountUtente.newInstance(AccountUtente.java:70)
at ProvaAccounts.main(ProvaAccounts.java:22)

Fino a java.lang.NullPointerException sono msg che scrivo io per monitorare
quello che fa il prog.

Il file XML č:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE accounts SYSTEM "accounts.dtd">

<accounts>
<account accountID="a1">
<utente>
<login>elmir</login>
<password>pippo</password>
<nome>Elmir</nome>
<cognome>Muratovic</cognome>
</utente>
<mailAccount ssl="false" deleteMail="true">
<mailHost>popmail.libero.it</mailHost>
<mailLogin>quellocheč</mailLogin>
<mailPassword>quellochetipare</mailPassword>
</mailAccount>
</account>
</accounts>

Avete idea di quale potrebbe essere il problema. :muro:
Nella riga 70 di AccountUtente c'č soltanto il richiamo alla funzione di parsing del parser.

kingv
05-08-2003, 16:30
posta il codice del costruttore di AccountUtente.

Icedguardian
05-08-2003, 21:14
/*
* AccountUtente.java
*
* Created on August 5, 2003, 10:52 AM
*/

/**
*
* @author elmir
*/

import java.util.LinkedList;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import java.io.File;
import java.io.IOException;

public class AccountUtente {

final static String INPUT_XML_FILE = "../xml/accounts.xml";
final static boolean DEBUG = true;

String login; //Login dell'utente
String password; //Password dell'utente
String nome; //Nome dell'utente
String cognome; //Cognome dell'utente
LinkedList accounts; //Gli account che l'utente possiede

AccountSAXHandler handler; //Handler utilizzato durante il parsing

/** Metodo che permette la creazione di AccountUtente ma soltanto se
la login e la password sono corrette (presenti nel file XML) */
static public AccountUtente newInstance(String l, String pass){

File xmlFile = new File(INPUT_XML_FILE);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = null;
spf.setValidating(true);

AccountUtente account = new AccountUtente(l);

if(DEBUG)
System.out.println("SAX parser utilizzato " + (spf.isValidating() ? "e'" : "non e'") + " validante");

try{

parser = spf.newSAXParser();

if(DEBUG)
System.out.println("Parser e': " + parser);
}catch(SAXException se){

se.printStackTrace(System.out);
System.exit(1);
}catch(ParserConfigurationException pce){

pce.printStackTrace(System.out);
System.exit(1);
}

if(DEBUG)
System.out.println("\nInizio parsing del file degli accounts");

try{

parser.parse(xmlFile, account.handler);
}catch(IOException e){

e.printStackTrace(System.out);
System.exit(1);
}catch(SAXException e){

e.printStackTrace(System.out);
System.exit(1);
}

if(account.login.compareTo(l) == 0 && account.password.compareTo(pass) == 0)
return account;
else
return null;

}

/** Creates a new instance of AccountUtente */
AccountUtente(String l) {

login = "";
handler = new AccountSAXHandler(l);
}

/**
* Classe che risponde agli eventi del parser SAX per
* prelevare le informazioni rilevanti dal file XML.
*/
class AccountSAXHandler extends DefaultHandler {

String l; //Login dell'account da cercare
String buff; //Buffer utilizzato per prelevare il contenuto degli elementi
AccountMail amAux; //AccountMail ausiliario utilizzato durante la lettura dal file

public AccountSAXHandler(String log){

l = log;
}

public void startDocument(){

if(DEBUG)
System.out.println("AccountUtente{AccountSAXHandler.startDocument()}");
}

public void endDocument(){

if(DEBUG)
System.out.println("AccountUtente{AccountSAXHandler.endDocument()}");
}

public void startElement(String uri, String localName, String qName, Attributes attr){

buff = "";

if(qName.compareTo("mailAccount") == 0){

amAux = new AccountMail();

//Valore di "ssl"
if(attr.getValue("ssl").compareTo("true") == 0)
amAux.setSSL(true);
else
amAux.setSSL(false);

//Valore di "deleteMail"
if(attr.getValue("deleteMail").compareTo("true") == 0)
amAux.setDeleteMail(true);
else
amAux.setDeleteMail(false);
}

if(DEBUG)
System.out.println("AccountUtente{AccountSAXHandler.startElement()}: <" + qName + ">");
}

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

if(qName.compareTo("login") == 0 && buff.compareTo(l) == 0) //

login = buff;
else if(qName.compareTo("password") == 0 && login.compareTo("") != 0){

password = buff;
}else if(qName.compareTo("nome") == 0 && login.compareTo("") != 0){

nome = buff;
}else if(qName.compareTo("cognome") == 0 && login.compareTo("") != 0){

cognome = buff;
}else if(qName.compareTo("mailHost") == 0 && login.compareTo("") != 0){

amAux.setHost(buff);
}else if(qName.compareTo("mailLogin") == 0 && login.compareTo("") != 0){

amAux.setLogin(buff);
}else if(qName.compareTo("mailPassword") == 0 && login.compareTo("") != 0){

amAux.setPassword(buff);
}else if(qName.compareTo("mailAccount") == 0 && login.compareTo("") != 0){

accounts.add(amAux);
}

if(DEBUG)
System.out.println("AccountUtente{AccountSAXHandler.endElement()}: </" + qName + ">");
}

public void characters(char[] ch, int start, int leng){

buff += new String(ch, start, leng);
}

public void warning(SAXParseException spe){

System.out.println("Warning alla linea " + spe.getLineNumber());
System.out.println(spe.getMessage());
}

public void fatalError(SAXParseException spe) throws SAXException{

System.out.println("FatalError alla linea " + spe.getLineNumber());
System.out.println(spe.getMessage());
throw spe;
}
}
}


------------------
Come si vede dal commento utilizzo un metodo statico per istanziare la classe e non il costruttore in modo da non istanziarla se non c'č l'account richiesto.

H E L P :cry:

kingv
06-08-2003, 10:01
a me funziona !

ho preso il tuo codice e tolto i riferimenti a classi che non avevo e cicla correttamente su tutto il file xml.

kingv
06-08-2003, 10:05
sei sicuro che quando chiami:


else if(qName.compareTo("mailHost") == 0 && login.compareTo("") != 0){

amAux.setHost(buff);
}else if(qName.compareTo("mailLogin") == 0 && login.compareTo("") != 0){

amAux.setLogin(buff);
}else if(qName.compareTo("mailPassword") == 0 && login.compareTo("") != 0){

amAux.setPassword(buff);


amAux sia istanziato??

Icedguardian
06-08-2003, 11:26
Dovrebbe :confused:
adesso controllo, spero sia questo il prob.

Icedguardian
06-08-2003, 12:26
Scusate sono un idiota :D

Il problema era che non avevo creato la LinkedList quindi quando facevo l'add(amAux) lui giustamente si lamentava.

:p

kingv
06-08-2003, 12:53
infatti il problema doveva essere in qualcuna delle righe che avevo commentato per compilare ;)