2017-06-26 52 views
0

我目前使用KSOAP2爲我的項目鏈接到SOAP WebService。到目前爲止,我已經設法得到一個結果,但現在我想將這個結果解析爲一個POJO。我已經閱讀,使用addMapping(namespace,node,class) 我可以得到我的結果到該對象,但我不知道我的代碼中的問題在哪裏。 所以我的問題是:如何解析KSOAP響應到我的自定義對象?KSOAP複雜的響應解析

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

我的XML響應

<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; 
     } 
    } 
} 

戈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; 
     } 

    } 
} 

回答

0

我居然找到了這裏我有文件:

請求

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; 
     } 

    } 
}