Autore Topic: non riesco a fare il parsing corretto dell'XML che torna dal WS .NET con KSOAP2  (Letto 505 volte)

Offline effesco

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7
Ciao a tutti,
sono alle prime armi con Android, ma sono diversi giorni che non riesco a venire a capo del problema in oggetto. Ho cercato in lungo e in largo sulla rete, mi pare di fare tutto bene, in base a quello che vedo, ma non riesco a sbloccare la situazione.

Lo scenario è questo: sto cercando di interrogare un WS .NET da una app android. La chiamata è semplice e non mi crea problemi; la risposta invece è una struttura XML su 2 livelli di cui allego la doc.

Codice (XML): [Seleziona]
  <soap:Body>
    <ProgettoResponse xmlns="[url=http://tempuri.org/">]tempuri - Bing[/url]
      <ProgettoResult xmlns="">
        <Success>boolean</Success>
        <Message>string</Message>
        <Progetto>
          <Titolo>string</Titolo>
          <Descrizione>string</Descrizione>
        </Progetto>
      </ProgettoResult>
    </ProgettoResponse>
  </soap:Body>

Io ho creato le 2 classi per fare la  KvmSerializable dei 2 oggetti che modellano la risposta XML: ProgettoResult e Progetto.

Codice (Java): [Seleziona]
package feronia.culturando.android;

import java.util.Hashtable;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

public class ProgettoResult implements KvmSerializable {


        private String          pSuccess;
        private String          pMessage;
        private Progetto        pProgetto;
       
        public Progetto getProgetto()
        {
                return pProgetto;
        }
       
        public void setProgetto(Progetto Progetto)
        {
                this.pProgetto = Progetto;
        }
       
        public ProgettoResult()
        {
                this.setSuccess("");
                this.setMessage("");
        }
       
        public ProgettoResult(String Success, String Message)
        {
                this.setSuccess(Success);
                this.setMessage(Message);
        }
       
        public Object getProperty(int arg0)
        {
                switch(arg0)
                {
                case 0:
                        return this.getSuccess();
                case 1:
                        return this.getMessage();
                case 2:
                        return this.getProgetto();
                }
                return null;
        }
       
       
        public int getPropertyCount()
        {
                return 3;
        }
       
        public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info)
        {
                switch(index)
                {
                case 0:
                        info.name="Success";
                        info.type=PropertyInfo.STRING_CLASS;
                        break;
                case 1:
                        info.name="Message";
                        info.type=PropertyInfo.STRING_CLASS;
                        break;
                case 2:
                        info.name="Progetto";
                        info.type=Progetto.class;
                        break;
                default:
                        break;
                }
        }
       
       
        public void setProperty(int index, Object value)
        {
                switch(index)
                {
                case 0:
                        this.setSuccess(value.toString());
                        break;
                case 1:
                        this.setMessage(value.toString());
                        break;
                case 2:
                        this.setProgetto((Progetto)value);
                        break;
                default:
                        break;
                }
        }
        /*********** GET - SET   *****************/
       
        public void setSuccess(String Success)
        {
                this.pSuccess = Success;
        }
       
        public String getSuccess()
        {
                return pSuccess;
        }
       
        public void setMessage(String Message)
        {
                this.pMessage = Message;
        }
       
        public String getMessage()
        {
                return pMessage;
        }
}

Codice (Java): [Seleziona]
package feronia.culturando.android;

import java.util.Hashtable;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

public class Progetto implements KvmSerializable{

        private String pTitolo;
        private String pDescrizione;
       
        public Progetto()
        {
                this.setTitolo("");
                this.setDescrizione("");
        }
       
        public Progetto(String t,String d)
        {
                this.setTitolo(t);
                this.setDescrizione(d);
        }
       
        public Object getProperty(int index)
        {
                switch(index)
                {
                case 0:
                        return this.getTitolo();
                case 1:
                        return this.getDescrizione();
                }
                return null;
        }

       
        public int getPropertyCount()
        {
                return 2;
        }


        public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info)
        {
                switch(index)
                {
                case 0:
                        info.name="Titolo";
                        info.type=PropertyInfo.STRING_CLASS;
                        break;
                case 1:
                        info.name="Descrizione";
                        info.type=PropertyInfo.STRING_CLASS;
                        break;
                default:
                        break;
                }
        }


        public void setProperty(int index, Object value)
        {
                switch(index)
                {
                case 0:
                        this.setTitolo(value.toString());
                        break;
                case 1:
                        this.setDescrizione(value.toString());
                        break;
                default:
                        break;
                }
        }
       
        /*********** GET - SET   *****************/
       
        public void setTitolo(String Titolo)
        {
                this.pTitolo = Titolo;
        }
       
       
        public String getTitolo()
        {
                return pTitolo;
        }
       
        public void setDescrizione(String Descrizione)
        {
                this.pDescrizione = Descrizione;
        }
       
        public String getDescrizione()
        {
                return pDescrizione;
        }
}
Di seguito riporto il codice della chiamata al WS nel modo che a me sembra corretto.

Codice (Java): [Seleziona]
package feronia.culturando.android;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;


public class webService
{
        public final String SOAP_ACTION = "[url=http://tempuri.org/Progetto";]tempuri - Bing[/url]
        public  final String METHOD_NAME = "Progetto";
        public  final String NAMESPACE = "[url=http://tempuri.org/";]tempuri - Bing[/url]
        public  final String URL = "http://www.feronia.it/intra/webservice/Cultura.asmx";
       
        public webService()
        {
        }
       
        public String Call(String a,int b)
        {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                PropertyInfo pi=new PropertyInfo();
                                pi.setName("a");
                        pi.setValue(a);
                        pi.setType(String.class);
                        request.addProperty(pi);
                        pi=new PropertyInfo();
                        pi.setName("b");
                        pi.setValue(b);
                        pi.setType(Integer.class);
                        request.addProperty(pi);
               
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
               
                envelope.dotNet = true;        
                envelope.setOutputSoapObject(request);
               
                envelope.addMapping(NAMESPACE, "ProgettoResult", new ProgettoResult().getClass());
                envelope.addMapping(NAMESPACE, "Progetto", new Progetto().getClass());

               
                HttpTransportSE httpTransport = new HttpTransportSE(URL);
                SoapObject response=null;
               
                String totalCount = "";
                try
                {
                        httpTransport.call(SOAP_ACTION, envelope);

                        response = (SoapObject)envelope.getResponse();
                        //totalCount = response.getPropertyAsString("Progetto").toString();    
                        //totalCount = response.toString();
                        //Progetto prog = response.getProgetto();
                        totalCount =  response.toString();
                        ////////////Progetto prog = (Progetto) response.getProperty(3);
                        //////////////totalCount = prog.toString();
                }
                catch (Exception e)
                {
                         e.printStackTrace();
                }
               
               
                //String totalCount = response.getProperty("Success").toString();
                //Object totalCount = response.getProperty(Progetto.class);
               
               
     
                //Object resultData = (SoapObject)response.getProperty(2);
               
                return "risposta dal WS = " + totalCount;
        }
       
       
}
Però ottengo in risposta dal soapObject la seguente informazione:

 anyType {Success=true; Message=OK; Progetto=anyType{};}

cioè vedo correttamente i dati del primo livello dell'XML (Success e Message) mentre il secondo livello è vuoto.

Qualcuno per favore mi sa indicare dove sbaglio?
Sto lavorando con ksoap2-android-assembly-2.6.0-jar-with-dependencies in ambiente android 2.1.

Ovviamente il WS funziona sicuramente perchè interrogato con gli stessi parametri risponde correttamente  sia ad un applicativo web che alla versione iPhone della stessa app che sto cercando di sviluppare

il logCat da esattamente la stessa situazione che riscontro nel display dell'emulatore:

richiesta:
02-03 18:23:35.385: I/(621): <v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"><v:Header /><v:Body><Progetto xmlns="tempuri - Bing id="o0" c:root="1"><a i:type="d:string"></a><b i:type="d:int">2</b></Progetto></v:Body></v:Envelope>

risposta:
02-03 18:23:35.385: I/(621): <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><ProgettoResponse xmlns="tempuri - Bing xmlns=""><Success>true</Success><Message>OK</Message><Progetto /></ProgettoResult></ProgettoResponse></soap:Body></soap:Envelope>






grazie 1000 in anticipo
« Ultima modifica: 13 Febbraio 2012, 09:42:01 CET da effesco, Reason: precisazioni »