Ciao,
stò letteralmente impazzendo con un progetto universitario. Praticamente ho un'applicazione Android che si deve connettere ad un WS da cui riceve un file XML (ma non vi preoccupate, si tratta di Java standard, anzi la parte della classe relativa ad Android non la pubblico neanche, questo codice potrebbe essere schiaffato identico in una qualsiasi normalissima applicazione Java).
In pratica la classe GuidaSubActivity effettua una connessione ad un mio web service passandogli 3 parametri: una latitudine, una longitudine ed un range (che è stato scritto in Java Spring), il WS gli restituisce un file XML contenente dei dati che devono essere parsati. I dati in questione contenuti nell'XML rappresentano una lista di punti di interesse dove ogni punto di interesse ha determinati campi come: longitudine, latitudine, nome, descrizione.
Il parsing consiste semplicemente nello scorrere questo file XML contenente questi punti di interesse, e di mettere i valori dei campi di ogni punto di interesse presenti nell'XML in un oggetto POI (che rappresenta un punto di interesse) al fine di creare una lista di POI
Il WS funziona più che correttamente: posso invocarne il relativo metodo passandogli la latitudine, longitudine e range sia dal browser sia usando SoapUI e tutto funziona benone...
Stò incontrando però grossissimi problemi però a creare la connessione con il WS ed a parsare l'XML ricevuto.
Vi spiego cosa ho fatto:
1) Nella classe GuidaSubActivity della mia applicazione ho il metodo getPois() che si connette al WS da cui ottiene la lista di punti di interesse, il codice di tale metodo è il seguente:
L'unica cosa relativa ad Android che c'è in questo codice è il metodo Log.d() che semplicemente consente di loggare le operazioni in un'apposita finestra di Eclipse, volendo potete sostituire Log.d con un banale println e fargli stampare la stessa cosa...il concetto è quello. Poi ci stà il metodo Toast che di fatto è un printf in Android (volendo basta toglierlo e non cambia nulla)codice://metodo che chiama il WS public List<Poi> getPois(String userLon, String userLat, String userRange){ /* Loggo l'entrata nel metodo getPois() che effettua la chiamata al web service ed i parametri ricevuti */ Log.d("Sono appena entrato nel metodo getPois() ed i parametri passati sono, userLon:", userLon); Log.d("userLon: ", userLon); Log.d("userLat: ", userLat); Log.d("userRange: ", userRange); List<Poi> pois = null; //Log.d("pois punta a: ", pois.toString()); Toast.makeText(this, "Loading POIs..", Toast.LENGTH_LONG).show(); String soapRequest = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:exam=\"http://example\">\n" + " <soapenv:Header/>\n" + " <soapenv:Body>\n" + " <exam:getRangePoi>\n" + " <exam:lon>"+userLon+"</exam:lon>\n" + " <exam:lat>"+userLat+"</exam:lat>\n" + " <exam:range>"+userRange+"</exam:range>\n" + " </exam:getRangePoi>\n" + " </soapenv:Body>\n" + "</soapenv:Envelope>"; Log.d("Ho messo il seguente XML con parametri dinamici nella variabile soapRequest", soapRequest); String soapAction = ""; Log.d("La soap action vale: ", soapAction.toString()); StringBuffer buffer = sendSoapRequest(soapRequest, soapAction); Log.d("Mette nel buffer il risultato restituito da sendSoapRequest: ", buffer.toString()); try{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); Log.d("Crea il parser che punta all'oggetto con indirizzo: ", parser.toString()); // System.out.println(buffer.toString()); // Che è sta robba ?!?! booo pussa viaaa !!! StringReader sr = new StringReader(buffer.toString()); Log.d("E' stato creato uno StringReader sr e passagli il contenuto del buffer in forma di stringa", sr.toString()); InputSource is = new InputSource(sr); Log.d("E' stato creato un oggetto InputSource is a cui viene passato il riferimento all'oggetto sr ", is.toString()); PoiSaxHandler handler = new PoiSaxHandler(); Log.d("E' stato creato l'oggetto handler di tipo PoiSaxHandler", handler.toString()); // ATTENZIONEEE NON EFFETTUA IL PARSING !!! parser.parse(is,handler); Log.d("Passo al parser l'oggetto is che è:", is.toString()); Log.d("Passo al pareser l'oggetto handler che è: ", handler.toString()); pois = handler.getPois(); // NB: Variabile dichiarata all'inizio del metodo Log.d("Invoco il metodo getPois sull'oggetto handler", "suka"); System.out.println("HttpClient.main pois "+pois.toString()); }catch(Exception e){ } Log.d("MioProgramma", pois.toString()); return pois; }
Praticamente questo metodo: riceve come parametri di input la longitudine e la latitudine in cui si trova l'utente ed un certo range e deve restituire al chiamante una lista di oggetti Poi che contiene tutti i punti di interesse entro un certo range kilometrico centrato sulla posizione dell'utente, la lista viene restituita appunto dal WS.
Come prima cosa dichiara una lista di generici oggetti Poi che punta inizialmente a null. Questa è la variabile che dovrà in fine essere restituita dal metodo in questione.
Poi dichiaro una variabile di tipo String chiamata soapRequest che contiene appunto la richiesta soap generata con soapUI. La richiesta soap è in forma XML ed ho fatto in modo da rendere dinamici i parametri userLon, userLat ed userRange. Dovrebbe essere correttissima !!! Infatti la loggo e mi pare di vederla corretta nei Log di Android (eventualmente basta fare un println)
Poi ho definito una variabile soapAction vuota perchè in questa richiesta al WS non ho bisogno di una Soap Action.
Poi creo una variabile StringBuffer buffer in cui metto il risultato ritornato dal metodo sendSoapRequest che come parametri prende la soapRequest e la soapAction precedentemente create e restituisce credo l'XML da parsare ricevuto dal WS, ecco quì il risultato loggato (non fate caso ai valori messi...hanno nome a cavolo perchè nel DB ho inserito punti con nomi e dati a cavolo ma mi pare essere corretto)
Poi crea un SaxParser che credo sia l'oggetto che mi servirà a parsare quell'XML brutto brutto che ho ricevuto. Anche quà loggo l'oggetto parser appena creato e pare che venga creato correttamente!!!codice:10-29 17:51:03.547: DEBUG/Mette nel buffer il risultato restituito da sendSoapRequest:(322): <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><getRangePoiResponse xmlns="http://example"><getRangePoiReturn><getRangePoiReturn xsi:type="ns1:Map" xmlns:ns1="http://xml.apache.org/xml-soap"><item xmlns=""><key xsi:type="xsd:string">WikiLink</key><value xsi:type="xsd:string">link 2</value></item><item xmlns=""><key xsi:type="xsd:string">Alt</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Tipologia</key><value xsi:type="xsd:int">0</value></item><item xmlns=""><key xsi:type="xsd:string">Distance</key><value xsi:type="xsd:double">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Lat</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Id</key><value xsi:type="xsd:int">3</value></item><item xmlns=""><key xsi:type="xsd:string">Lon</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Nome</key><value xsi:type="xsd:string">test 2</value></item></getRangePoiReturn><getRangePoiReturn xsi:type="ns2:Map" xmlns:ns2="http://xml.apache.org/xml-soap"><item xmlns=""><key xsi:type="xsd:string">WikiLink</key><value xsi:type="xsd:string">lll</value></item><item xmlns=""><key xsi:type="xsd:string">Alt</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Tipologia</key><value xsi:type="xsd:int">0</value></item><item xmlns=""><key xsi:type="xsd:string">Distance</key><value xsi:type="xsd:double">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Lat</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Id</key><value xsi:type="xsd:int">13</value></item><item xmlns=""><key xsi:type="xsd:string">Lon</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Nome</key><value xsi:type="xsd:string">aaab</value></item></getRangePoiReturn><getRangePoiReturn xsi:type="ns3:Map" xmlns:ns3="http://xml.apache.org/xml-soap"><item xmlns=""><key xsi:type="xsd:string">WikiLink</key><value xsi:type="xsd:string">lll</value></item><item xmlns=""><key xsi:type="xsd:string">Alt</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Tipologia</key><value xsi:type="xsd:int">0</value></item><item xmlns=""><key xsi:type="xsd:string">Distance</key><value xsi:type="xsd:double">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Lat</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Id</key><value xsi:type="xsd:int">12</value></item><item xmlns=""><key xsi:type="xsd:string">Lon</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Nome</key><value xsi:type="xsd:string">jiji</value></item></getRangePoiReturn><getRangePoiReturn xsi:type="ns4:Map" xmlns:ns4="http://xml.apache.org/xml-soap"><item xmlns=""><key xsi:type="xsd:string">WikiLink</key><value xsi:type="xsd:string"></value></item><item xmlns=""><key xsi:type="xsd:string">Alt</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Tipologia</key><value xsi:type="xsd:int">0</value></item><item xmlns=""><key xsi:type="xsd:string">Distance</key><value xsi:type="xsd:double">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Lat</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Id</key><value xsi:type="xsd:int">11</value></item><item xmlns=""><key xsi:type="xsd:string">Lon</key><value xsi:type="xsd:float">0.0</value></item><item xmlns=""><key xsi:type="xsd:string">Nome</key><value xsi:type="xsd:string">POITest222</value></item></getRangePoiReturn><getRangePoiReturn xsi:type="ns5:Map" xmlns:ns5="http://xml.apache.org/xml-soap"><item xmlns=""><key xsi:type="xsd:string">WikiLink</key><value xsi:type="x
Poi creo gli oggetti StringReader sr ed InputSource is ed anche questi li loggo e dovrebbero essere ok
Con la seguente riga di codice creo il mio handler personale che dovrebbe essere l'oggetto che contiene le regole per parsare il mio XML (almeno da quanto ho capito...mi date conferma? non ho fatto tutto io, è un progetto di gruppo)
Infine parserizzo l'oggetto con questa riga e quì si inchioda !!! Non riesce a terminare questo metodo:codice:PoiSaxHandler handler = new PoiSaxHandler();
Il metodo parse invocato sul parser passandogli l'input source e l'handler che gli dice come parserizzare non termina !!!codice:parser.parse(is,handler);
In realtà appaiono dei messaggi di log che ho fatto nel codice dell'handler...quindi pare che in qualche modo l'handler faccia qualcosa e pare evidente che si vada ad inchiodare da qualche parte dentro l'handler.

Rispondi quotando