Have you considered making the soap requests without use of libraries? I had the same problem earlier and it led me to discovering that libraries will make your work harder, especially when it comes to making changes in the structure of the request. This is how you make a soap request without use of libraries:
First of all you will need to know how to make use of SOAP Ui which is a windows application. You can import your wsdl file here and if it's syntax us correct, then you will get a screen showing the request body for your webservice. You can enter test values and you will get a response structure. This link will guide you on how to use soap ui https://www.soapui.org/soap-and-wsdl/working-with-wsdls.html
Now on to the android code :
We will create a class named runTask which extends async task and use http to send the request body and get request response :
private class runTask extends AsyncTask<String, String, String> {
private String response;
String string = "your string parameter"
String SOAP_ACTION = "your soap action here";
String stringUrl = "http://your_url_here";
//if you experience a problem with url remove the '?wsdl' ending
@Override
protected String doInBackground(String... params) {
try {
//paste your request structure here as the String body(copy it exactly as it is in soap ui)
//assuming that this is your request body
String body = "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">" +
"<soap:Body>"+
"<GetCitiesByCountryResponse xmlns="http://www.webserviceX.NET">"+
"<GetCitiesByCountryResult>"+string+"</GetCitiesByCountryResult>"+
"</GetCitiesByCountryResponse>"+
"</soap:Body>"+
"</soap:Envelope>";
try {
URL url = new URL(stringUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDefaultUseCaches(false);
conn.setRequestProperty("Accept", "text/xml");
conn.setRequestProperty("SOAPAction", SOAP_ACTION);
//push the request to the server address
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(body);
wr.flush();
//get the server response
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
response = builder.toString();//this is the response, parse it in onPostExecute
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* @see AsyncTask#onPostExecute(Object)
*/
@Override
protected void onPostExecute(String result) {
try {
Toast.makeText(this,"Response "+ result,Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
Now just execute the class and watch the magic happen:
runTask runner = new runTask();
runner.execute();
You can parse the response using a DOM or SAX parser to get desired values.
Feel free to ask for further clarification.