It looks like KSoap has a hardcoded value for the namespace in SoapEnvelope
:
/**
* Writes the complete envelope including header and body elements to the
* given XML writer.
*/
public void write(XmlSerializer writer) throws IOException {
writer.setPrefix("i", xsi);
writer.setPrefix("d", xsd);
writer.setPrefix("c", enc);
writer.setPrefix("v", env);
writer.startTag(env, "Envelope");
writer.startTag(env, "Header");
writeHeader(writer);
writer.endTag(env, "Header");
writer.startTag(env, "Body");
writeBody(writer);
writer.endTag(env, "Body");
writer.endTag(env, "Envelope");
}
The SoapSerializationEnvelope
you're creating here:
envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
…is a subclass of SoapEnvelope
. So, to change the behaviour, you need to subclass SoapSerializationEnvelope
like so:
public class CustomSoapSerializationEnvelope extends SoapSerializationEnvelope {
@Override
public void write(XmlSerializer writer) throws IOException {
writer.setPrefix("i", xsi);
writer.setPrefix("d", xsd);
writer.setPrefix("c", enc);
writer.setPrefix("soap", env); // <-- changed line
writer.startTag(env, "Envelope");
writer.startTag(env, "Header");
writeHeader(writer);
writer.endTag(env, "Header");
writer.startTag(env, "Body");
writeBody(writer);
writer.endTag(env, "Body");
writer.endTag(env, "Envelope");
}
}
Then, replace the above line with:
envelope = new CustomSoapSerializationEnvelope(SoapEnvelope.VER12);