2017-06-26 8 views
0

Ich verwende derzeit KSOAP2 für mein Projekt, das mit einem SOAP WebService verbunden ist. Bis jetzt habe ich es geschafft, ein Ergebnis zu erzielen, aber jetzt musste ich dieses Ergebnis in ein POJO parsen. Ich habe gelesen, dass mit addMapping(namespace,node,class) ich mein Ergebnis in dieses Objekt bekommen konnte, aber ich weiß nicht, wo das Problem in meinem Code ist. Meine Frage wäre also: Wie analysiert man die KSOAP-Antwort in mein benutzerdefiniertes Objekt?KSOAP Complex Response Parsing

die wsdl: http://www.webservicex.net/geoipservice.asmx?wsdl

Meine XML-Antwort

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <GetGeoIPResponse xmlns="http://www.webservicex.net/"> 
     <GetGeoIPResult> 
      <ReturnCode>1</ReturnCode> 
      <IP>127.0.0.1</IP> 
      <ReturnCodeDetails>Success</ReturnCodeDetails> 
      <CountryName>Reserved</CountryName> 
      <CountryCode>ZZZ</CountryCode> 
     </GetGeoIPResult> 
     </GetGeoIPResponse> 
    </soap:Body> 
</soap:Envelope> 

MainActivity.java

private static final String SOAP_ACTION = "http://www.webservicex.net/GetGeoIP"; 
private static final String METHOD_NAME = "GetGeoIP"; 
private static final String NAMESPACE = "http://www.webservicex.net/"; 
private static final String URL = "http://www.webservicex.net/geoipservice.asmx?wsdl"; 

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

addProperty("IPAddress","127.0.0.1"); 


SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
soapEnvelope.dotNet= true; 

soapEnvelope.setOutputSoapObject(request); 
soapEnvelope.addMapping(NAMESPACE,"getGeoIPResponse", new GetGeoIPResponse().getClass()); 
soapEnvelope.addMapping(NAMESPACE,"getGeoIPResult", new GetGeoIPResult().getClass()); 

soapEnvelope.implicitTypes = true; 
HttpTransportSE transport = new HttpTransportSE(URL); 
transport.debug = true; 


try { 
    transport.call(SOAP_ACTION, soapEnvelope); 
} catch (IOException e) { 
     e.printStackTrace(); 
} catch (XmlPullParserException e) { 
     e.printStackTrace(); 
} catch (Exception e) { 
     e.printStackTrace(); 
} 

SoapObject resultString = (SoapObject) soapEnvelope.bodyIn; 


Log.i(TAG, "Result: " + resultString); 
} catch (Exception ex) { 
    Log.e(TAG, "Error: " + ex.getMessage()); 
} 

GetGeoResponse.java

public class GetGeoIPResponse implements KvmSerializable{ 

    GetGeoIPResult getGeoIPResult = new GetGeoIPResult(); 

    @Override 
    public Object getProperty(int index) { 
     if(index == 0){ 
      return this.getGeoIPResult; 
     } 
     return null; 
    } 

    @Override 
    public int getPropertyCount() { 
     return 1; 
    } 

    @Override 
    public void setProperty(int index, Object value) { 
     if(index == 0){ 
      this.getGeoIPResult =(GetGeoIPResult) value; 
     } 
    } 

    @Override 
    public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) { 

     if(index == 0){ 
      info.name = "GetGeoIPResult"; 
      info.type = GetGeoIPResult.class; 
     } 
    } 
} 

Ge tGeoIPResult.java

public class GetGeoIPResult implements KvmSerializable { 

    private Integer returnCode; 
    private String IP; 
    private String returnCodeDetails; 
    private String countryName; 
    private String countryCode; 

    @Override 
    public Object getProperty(int index) { 
     switch (index){ 
      case 0: return returnCode; 
      case 1: return IP; 
      case 2: return returnCodeDetails; 
      case 3: return countryName; 
      case 4: return countryCode; 
      default: return null; 
     } 
    } 

    @Override 
    public int getPropertyCount() { 
     return 5; 
    } 

    @Override 
    public void setProperty(int index, Object value) { 
     switch (index){ 
      case 0: 
       returnCode = Integer.parseInt(value.toString()); 
       break; 
      case 1: 
       IP = value.toString(); 
       break; 
      case 2: 
       returnCodeDetails = value.toString(); 
       break; 
      case 3: 
       countryName = value.toString(); 
       break; 
      case 4: 
       countryCode = value.toString(); 
       break; 
      default: 
       break; 
     } 

    } 

    @Override 
    public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) { 
     switch (index){ 
      case 0: 
       info.name = "ReturnCode"; 
       info.type = PropertyInfo.INTEGER_CLASS; 
       break; 
      case 1: 
       info.name = "IP"; 
       info.type = PropertyInfo.STRING_CLASS; 
       break; 
      case 2: 
       info.name = "ReturnCodeDetails"; 
       info.type = PropertyInfo.STRING_CLASS; 
       break; 
      case 3: 
       info.name = "CountryName"; 
       info.type = PropertyInfo.STRING_CLASS; 
       break; 
      case 4: 
       info.name = "CountryCode"; 
       info.type = PropertyInfo.STRING_CLASS; 
       break; 
      default: 
       break; 
     } 

    } 
} 

Antwort

0

Ich fand heraus selbst hier sind die Dateien:

Anfrage

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

      request.addProperty("IPAddress","127.0.0.1"); 

      SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      soapEnvelope.dotNet= true; 

      soapEnvelope.setOutputSoapObject(request); 

      soapEnvelope.addMapping(NAMESPACE,"GetGeoIPResponse", GetGeoIPResponse.class); 
      soapEnvelope.addMapping(NAMESPACE,"GetGeoIPResult", GetGeoIPResult.class); 

      soapEnvelope.implicitTypes = true; 
      HttpTransportSE transport = new HttpTransportSE(URL); 
      transport.debug = true; 
      transport.call(SOAP_ACTION, soapEnvelope); 

      GetGeoIPResponse resultString = (GetGeoIPResponse) soapEnvelope.bodyIn; 

GetGeoIPResult.java

public class GetGeoIPResult implements KvmSerializable { 

     private Integer returnCode; 
     private String IP; 
     private String returnCodeDetails; 
     private String countryName; 
     private String countryCode; 

     @Override 
     public Object getProperty(int index) { 
      switch (index){ 
       case 0: return returnCode; 
       case 1: return IP; 
       case 2: return returnCodeDetails; 
       case 3: return countryName; 
       case 4: return countryCode; 
       default: return null; 
      } 
     } 

     @Override 
     public int getPropertyCount() { 
      return 5; 
     } 

     @Override 
     public void setProperty(int index, Object value) { 
      switch (index){ 
       case 0: 
        returnCode = Integer.parseInt(value.toString()); 
        break; 
       case 1: 
        IP = value.toString(); 
        break; 
       case 2: 
        returnCodeDetails = value.toString(); 
        break; 
       case 3: 
        countryName = value.toString(); 
        break; 
       case 4: 
        countryCode = value.toString(); 
        break; 
       default: 
        break; 
      } 

     } 

     @Override 
     public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) { 
      switch (index){ 
       case 0: 
        info.name = "ReturnCode"; 
        info.type = PropertyInfo.INTEGER_CLASS; 
        break; 
       case 1: 
        info.name = "IP"; 
        info.type = PropertyInfo.STRING_CLASS; 
        break; 
       case 2: 
        info.name = "ReturnCodeDetails"; 
        info.type = PropertyInfo.STRING_CLASS; 
        break; 
       case 3: 
        info.name = "CountryName"; 
        info.type = PropertyInfo.STRING_CLASS; 
        break; 
       case 4: 
        info.name = "CountryCode"; 
        info.type = PropertyInfo.STRING_CLASS; 
        break; 
       default: 
        break; 
      } 

     } 
    } 

GetGeoIPResponse.java

public class GetGeoIPResponse implements KvmSerializable { 

    private GetGeoIPResult getGeoIPResult; 

    @Override 
    public Object getProperty(int index) { 
     switch (index){ 
      case 0: 
       return getGeoIPResult; 
      default: return null; 
     } 
    } 

    @Override 
    public int getPropertyCount() { 
     return 1; 
    } 

    @Override 
    public void setProperty(int index, Object value) { 
     switch (index){ 
      case 0: 
       getGeoIPResult = (GetGeoIPResult) value; 
       break; 
     } 

    } 

    @Override 
    public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) { 
     switch (index){ 
      case 0: 
       info.name = "GetGeoIPResult"; 
       info.type = GetGeoIPResult.class; 
       break; 
     } 

    } 
}