Thats because you have complex type (ie Objects) and you are just adding "Simple type" property.
check my answer here, i explained in details what needs to be done.
You will also have to create local classes that match the complex type, these local classes should implement kvmserializable, for example:
<s:element name="GetBoundData">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Bound" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Zoom" type="s:string"/>
</s:sequence>
</s:complexType>
means on the web service, there exists a class called "GetBoundData". So since using ksoap2 you are building manually the soap envelope, you will have to create such a class in your app , implementing kvmserializable ( which is a ksoap2 serialization interface):
public class GetBoundData implements KvmSerializable {
String Bound;
String Zoom;
@Override
public Object getProperty(int arg0) {
switch (arg0){
case 0:
return Bound;
case 1:
return Zoom;
default:
return null;
}
}
@Override
public int getPropertyCount() {
return 2;//because you have 2 parameters
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch(arg0)
{
case 0:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Bound";
break;
case 1:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Zoom";
break;
default:break;
}
}
@Override
public void setProperty(int arg0, Object arg1) {
switch(arg0)
{
case 0:
Bound = (String)arg1;
break;
case 1:
Zoom = (String)arg1;
break;
default:
break;
}
}
This is how you build locally a match for the Classes (object,ie complex type) on the server).
Then you have to add the necessary properties, build the envelope, add Mapping and Marshalling and send the request. These Steps are all explained in the link i mentioned above.
UPDATE
I'll explain to you what these are:
<wsdl:message name="GetBoundDataSoapIn">
<wsdl:part name="parameters" element="tns:GetBoundData"/>
</wsdl:message>
When is it wsdl:message it means it is a function required on the web service.
it has , which means it requires a parameter of type GetBoundData which is not a primitive type, in fact it is a complex type (object).
So here are the steps:
1- you have to write a local representation , ie class, of the complex type GetBoundData ( i already wrote it above)
2- In your application you have to create (its up to u where) a function that will call the function related to "GetBoundDataSoapIn" on the web service. So its a good idead to create a function whose name is significat ie something like:
public GetBoundData getBoundData()
{
try
{
SoapObject sobj = new SoapObject(YOUR_NAMESPACE,THE_METHOD_NAME);
//------------------------------------------------------------------------------
// GetBoundData :adding property
// <wsdl:message name="GetBoundDataSoapIn">
// <wsdl:part name="parameters" element="tns:GetBoundData"/>
// </wsdl:message>
// GetBoundData has two params:
// <s:element minOccurs="0" maxOccurs="1" name="Bound" type="s:string"/>
// <s:element minOccurs="0" maxOccurs="1" name="Zoom" type="s:string"/>
//
//--------------------------------------------------------------------------
//--------------
// GetBoundData
//--------------
PropertyInfo pi = new PropertyInfo();
pi.setName("GetBoundData");
pi.setValue(Whatever_value_your_supposed_to_put);// these values are "Bound" And "Zoom" , they're supposed to be gotten in your app somewhere
pi.setType(GetBoundData.class);
sobj.addProperty(pi);
//------------------------------
// START BUILDING SOAP ENVELOPE
//------------------------------
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.setOutputSoapObject(sobj);
//---------------------------------------------------------------------------------------
// MAPPINGS:
//---------------------------------------------------------------------------------------
soapEnvelope.addMapping(YOUR_NAMESPACE, GetBoundData.class.getSimpleName(), GetBoundData.class);
//---------------------------------------------------------------------------------------
// MARSHALLING:
//---------------------------------------------------------------------------------------
Marshal floatMarshal = new MarshalFloat();
floatMarshal.register(soapEnvelope);
AndroidHttpTransport aht = new AndroidHttpTransport(YOUR_URL);
aht.debug = true;
try
{
aht.call(YOUR_ACTION, soapEnvelope);
//Importat Outputs to check how the request/Response looks like.. Check Logcat to find these outputs
System.out.println("aht requestDump is :"+aht.requestDump);
System.out.println("aht responseDump is :"+aht.responseDump);
return soapEnvelope.getResponse();
}
catch (Exception e)
{
e.printStackTrace();
return "Exception: " + e.getMessage()+" message IS :" +e.getMessage()+" localizedmessage is :"+e.getLocalizedMessage();
}
}
catch(Exception ex)
{
ex.printStackTrace();
return "Exception: " + ex.getMessage();
}
}
}
So check logCat to see the shape of request and response, and you'll see if you have to get the response and parse it to use it, i am not sure what your response will be, but in my case it was a multidimensional array, so i had to parse it using java functionalities.
as for:
<wsdl:message name="GetBoundDataSoapOut">
<wsdl:part name="parameters" element="tns:GetBoundDataResponse"/>
</wsdl:message>
this just tells you the web service sends back a response.