|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: May 2003
Messaggi: 283
|
java e XML
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. ![]() Nella riga 70 di AccountUtente c'è soltanto il richiamo alla funzione di parsing del parser.
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5705
|
posta il codice del costruttore di AccountUtente.
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2003
Messaggi: 283
|
/*
* 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 ![]()
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5705
|
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. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5705
|
sei sicuro che quando chiami:
Codice:
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); |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: May 2003
Messaggi: 283
|
Dovrebbe
![]() adesso controllo, spero sia questo il prob.
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2003
Messaggi: 283
|
Scusate sono un idiota
![]() Il problema era che non avevo creato la LinkedList quindi quando facevo l'add(amAux) lui giustamente si lamentava. ![]()
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5705
|
infatti il problema doveva essere in qualcuna delle righe che avevo commentato per compilare
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:50.