Search code examples
androidweb-servicessoapksoap2

How to remove i:type="d:string" from PropertyInfo of SOAP in KSOAP2 Android


I am using ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar

I am working on a project where i need the following soap request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mod="http://www.tmforum.org/xml/tip/model" xmlns:cust="http://www.tmforum.org/xml/tip/customer/cust">
   <soapenv:Header/>
   <soapenv:Body>
      <mod:listProblemsRequest>
         <!--Optional:-->
         <mod:customer>

            <cust:iD >1100000677</cust:iD>
         </mod:customer>


      </mod:listProblemsRequest>
   </soapenv:Body>
</soapenv:Envelope>

but using KSOAP2 I am able to generate the following request:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
   <v:Body>
      <retrieveCustomerProfileRequest xmlns="http://www.tmforum.org/xml/tip/model">
           <n0:customer xmlns:n0="http://www.tmforum.org/xml/tip/model">
               <n1:iD i:type="d:string" xmlns:n1="http://www.tmforum.org/xml/tip/customer      /cust">1100000990</n1:iD> 
   </n0:customer>
   </retrieveCustomerProfileRequest>
  </v:Body>
</v:Envelope>

How do I remove i:type="d:string" from the SOAP request.

Please suggest a solution or any Workaround that could be done in Source code of KSOAP2 so that I may be able to generate the appropriate request.


Solution

  • I have found a workaround to my problem in ksoap :

    1. Download the source code of Ksoap2.jar.
    2.open up Transport .java and edit its :
    
        protected byte[] createRequestData(SoapEnvelope envelope, String encoding)
                    throws IOException  
    
    Method.
    
    3.i edited it as follows:
    
    
    protected byte[] createRequestData(SoapEnvelope envelope, String encoding)
                throws IOException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream(bufferLength);
            byte result[] = null;
            bos.write(xmlVersionTag.getBytes());
            XmlSerializer xw = new KXmlSerializer();
            xw.setOutput(bos, encoding);
            envelope.write(xw);
            xw.flush();
            bos.write('\r');
            bos.write('\n');
            bos.flush();
            result = bos.toByteArray();
            xw = null;
            bos = null;
    
    
            String requestObject = new String(result);
            String pattern = "i:type=\"d:string\"";
    
            String resultString="";
    
            System.out.println("==earlier String==" + requestObject);
            if (requestObject.contains(pattern)) {
    
                System.out.println("==is it here ");
                resultString=requestObject.replace(pattern, "");
    
    }
    
    4.compile this class using classpath of ksoap2.jar
    5.extract the ksoap2.jar and remove existing transport.class from it.
    6.Add newly compiled .class file and make a new jar.
    7.import the jar in your project.
    Problem solved..