Search code examples
javaandroidretrofitretrofit2simple-framework

How to deserialize object in java SimpleXML


i have to send request by soap. and i use Retrofit2. i cant convert and deserialize the response. in type of xml like "xsi" instance "xmlns" its my problem.

this is my response

 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:requestCPResponse xmlns:ns2="http://incomingwebchannel.hrz.jpos.org/">
         <return xsi:type="ns2:jiringBillInqOut" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <refNo>091015900983</refNo>
            <responseCode>03</responseCode>
         </return>
      </ns2:requestCPResponse>
   </S:Body>
</S:Envelope>

and this is my retrofit interface

 @POST("/nafis-web-3/services/mobile")
 Call<UsStatesResponseEnvelope> requestCP(@Body UsStatesRequestEnvelope body);

this is my request code

new RequestCallback<>(activity, true, ApiClient.createApi(activity).requestCP(envelope), new RequestListener<UsStatesResponseEnvelope>() {
                @Override
                public void onResponse(@NonNull final Response<UsStatesResponseEnvelope> response) {

                    try {
                        com.teskaco.transactionsample.utils.Log.e(response.body().getBody().getUsStatesCPResponse().getStatesResponseReturn().getResponseCode());



                    } catch (Exception e) {

                        Log.e("TAG", e.getMessage());
                    }
                }

                @Override
                public void onFailure(@NonNull int code, @NonNull JsonObject jsonObject) {
                }
            });

and this is my model. UsStatesResponseBody.clss

@Root(name = "S:Envelope")
@NamespaceList({
        @Namespace( prefix = "S", reference = "http://schemas.xmlsoap.org/soap/envelope/")})
public class UsStatesResponseEnvelope {

    @Element(name = "S:Body", required = false)
    private UsStatesResponseBody body;

    public UsStatesResponseBody getBody() {
        return body;
    }

    public void setBody(UsStatesResponseBody body) {
        this.body = body;
    }
}

class UsStatesResponseBody.clss

    @Root(name = "S:Body", strict = false)
public class UsStatesResponseBody {

    @Element(name = "ns2:requestCPResponse",required = false)
    private UsStatesCPResponse cpResponse;

    public UsStatesCPResponse getUsStatesCPResponse() {
        return cpResponse;
    }

    public void UsUsStatesCPResponse(UsStatesCPResponse responseReturn) {
        this.cpResponse = responseReturn;
    }
}

UsStatesCPResponse.clss

@Root(name = "ns2:requestCPResponse", strict = false)
@NamespaceList({
        @Namespace( prefix = "ns2", reference = "http://incomingwebchannel.hrz.jpos.org/")})
public class UsStatesCPResponse {

    @Element(name = "return",required = false)
    private UsStatesResponseReturn responseReturn;

    public UsStatesResponseReturn getStatesResponseReturn() {
        return responseReturn;
    }

    public void UsStatesResponseReturn(UsStatesResponseReturn responseReturn) {
        this.responseReturn = responseReturn;
    }
}

UsStatesResponseReturn.clss

@Root(name = "return", strict = false)
@NamespaceList({
        @Namespace( prefix = "xsi:type", reference = "ns2:jiringBillInqOut"),
        @Namespace( prefix = "xsi", reference = "http://www.w3.org/2001/XMLSchema-instance")
})
public class UsStatesResponseReturn {

    @Element(name = "refNo",required = false)
    private String refNo;

    @Element(name = "responseCode",required = false)
    private String responseCode;

    public String getRefNo() {
        return refNo;
    }

    public void setRefNo(String refNo) {
        this.refNo = refNo;
    }

    public String getResponseCode() {
        return responseCode;
    }

    public void setResponseCode(String responseCode) {
        this.responseCode = responseCode;
    }
}

Solution

  • i solve with tray and error.

    Parent class

     import org.simpleframework.xml.Element;
        import org.simpleframework.xml.Namespace;
        import org.simpleframework.xml.Root;
    
        @Root(name = "S:Envelope" ,strict = false)
        @Namespace(prefix = "S", reference = "http://schemas.xmlsoap.org/soap/envelope/")
        public class BuyResponseEnvelope {
    
            @Element(name = "Body")
            private BuyResponseBody body;
    
            public BuyResponseBody getBody() {
                return body;
            }
    
            public void setBody(BuyResponseBody body) {
                this.body = body;
            }
    
    
        }
    

    Body class

      import org.simpleframework.xml.Element;
    import org.simpleframework.xml.Root;
    
    @Root(name = "S:Body" ,strict = false)
    public class BuyResponseBody {
    
        @Element(name = "requestCPResponse")
        private BuyCPResponse cpResponse;
    
    
        public BuyCPResponse getCpResponse() {
            return cpResponse;
        }
    
        public void setCpResponse(BuyCPResponse cpResponse) {
            this.cpResponse = cpResponse;
        }
    }
    

    request cp class

    import org.simpleframework.xml.Element;
    import org.simpleframework.xml.Namespace;
    import org.simpleframework.xml.Root;
    
    
    @Root(name = "ns2:requestCPResponse",strict = false)
    @Namespace( prefix = "ns2", reference = "http://incomingwebchannel.hrz.jpos.org/")
    public class BuyCPResponse {
    
        @Element(name = "return")
        private BuyResponseReturn responseReturn;
    
        public BuyResponseReturn getResponseReturn() {
            return responseReturn;
        }
    
        public void setResponseReturn(BuyResponseReturn responseReturn) {
            this.responseReturn = responseReturn;
        }
    }
    

    and return class

    import org.simpleframework.xml.Attribute;
    import org.simpleframework.xml.Element;
    import org.simpleframework.xml.Namespace;
    import org.simpleframework.xml.NamespaceList;
    import org.simpleframework.xml.Root;
    
    @Root(name = "return",strict = false)
    @Namespace( prefix = "xsi", reference = "http://www.w3.org/2001/XMLSchema-instance")
    public class BuyResponseReturn {
    
    
        @Element(name = "refNo")
        private String refNo;
    
        @Element(name = "responseCode")
        private String responseCode;
    
        public String getRefNo() {
            return refNo;
        }
    
        public void setRefNo(String refNo) {
            this.refNo = refNo;
        }
    
        public String getResponseCode() {
            return responseCode;
        }
    
        public void setResponseCode(String responseCode) {
            this.responseCode = responseCode;
    
        }
    
    }