Search code examples
javaxmlsoap-client

Parsing XML Failed


I get the following response XML String after calling a SOAP web service. How can i parse the response back to Java entity so that i can handle the ErrMsg and Status accordingly? I tried with the below code, but keep getting error

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"NewDataSet"). Expected elements are <{TransactionalSubmissionsSvcs}NewDataSet>
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)

Sample Response in String

 <NewDataSet>
  <SubmissionResult>
    <Status>200</Status>
    <RefNo>363180319bigKj83i</RefNo>
    <ErrMsg>Successful</ErrMsg>
  </SubmissionResult>
</NewDataSet>

Sample Client XML Parser

    JAXBContext jaxbContext = JAXBContext.newInstance(NewDataSet.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

    StringReader reader = new StringReader("Sample Response in String above");
    NewDataSet newDataSet = (NewDataSet) jaxbUnmarshaller.unmarshal(reader);
    System.out.println(newDataSet.getSubmissionResult());

NewDataSet.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
 "submissionResult"
})
@XmlRootElement(name = "NewDataSet")
public class NewDataSet {

 @XmlElement(name = "SubmissionResult", required = true)
 protected NewDataSet.SubmissionResult submissionResult;

 public NewDataSet.SubmissionResult getSubmissionResult() {
  return submissionResult;
 }

 public void setSubmissionResult(NewDataSet.SubmissionResult value) {
  this.submissionResult = value;
 }

 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "", propOrder = {
  "status",
  "refNo",
  "errMsg"
 })
 public static class SubmissionResult {

  @XmlElement(name = "Status")
  protected short status;
  @XmlElement(name = "RefNo", required = true)
  protected String refNo;
  @XmlElement(name = "ErrMsg", required = true)
  protected String errMsg;

  public short getStatus() {
   return status;
  }

  public void setStatus(short value) {
   this.status = value;
  }

  public String getRefNo() {
   return refNo;
  }

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

  public String getErrMsg() {
   return errMsg;
  }

  public void setErrMsg(String value) {
   this.errMsg = value;
  }
 }

}

Note: If possible i prefer to use standard java library or external library that is being maintained regularly and up to date.


Solution

  • Found the reason, it was resolved by removing the namespace = "TransactionalSubmissionsSvcs"

    @javax.xml.bind.annotation.XmlSchema(namespace = "TransactionalSubmissionsSvcs",elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
    package com.mailadapter;
    

    to become

    @javax.xml.bind.annotation.XmlSchema(elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
    package com.mailadapter;