unexpected element error while unmarshalling

java, jaxb, unmarshalling

Solution

Part 1

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.com/service/response/v1", local:"WebResponse"). Expected elements are <{http://example.com/service/request/v1}WebResponse>
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:603)

The problem is the namespaces specified in the XML (`response/v1` and `request/v1`).

<WebResponse xmlns="http://example.com/service/response/v1">

and `package-info` are different

@XmlSchema(namespace = "http://example.com/service/request/v1", elementFormDefault = XmlNsForm.QUALIFIED)
package com.example;

Part 2

Your current object model and mappings do not match the XML content. One way to solve this would be to introduce a `Status` class as answered by Ash.

Status

import javax.xml.bind.annotation.XmlElement;

public class Status {

    private long statusCode;
    private String description;

    @XmlElement(name = "StatusCode")
    public long getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(long statusCode) {
        this.statusCode = statusCode;
    }

    @XmlElement(name = "Description")
    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

WebResponse

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "WebResponse")
public class WebResponse {

    private Status status;

    @XmlElement(name="Status")
    public Status getStatus() {
        return status;
    }

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

}

Problem

I should unmarshall simple xml as belo but getting error as ``` Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.com/service/response/v1", local:"WebResponse"). Expected elements are <{http://example.com/service/request/v1}WebResponse> at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:603) I tried the solutions in this site but could not solve pls help. ``` This is the xml present in response.xml file ``` <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> - <WebResponse xmlns="http://example.com/service/response/v1"> - <Status> <StatusCode>0</StatusCode> <Description>Transaction was successful</Description> </Status> </WebResponse> ``` Below is my code : WebResponse class: The webresponse class for storing the retrieved xml ``` import javax.xml.bind.annotation.*; @XmlRootElement(name="WebResponse") public class WebResponse { private long statusCode; private String description; @XmlElement(name= "StatusCode") public long getStatusCode() { return statusCode; } public void setStatusCode(long statusCode) { this.statusCode = statusCode; } @XmlElement(name= "Description") public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } ``` WebResponseMain class: Tester class ``` import javax.xml.bind.Unmarshaller; import javax.xml.bind.JAXBContext; import java.io.FileReader; import com.example.WebResponse; public class WebResponseMain { public static void main(String[] args) throws Exception{ JAXBContext context = JAXBContext.newInstance(WebResponse.class); Unmarshaller um = context.createUnmarshaller(); WebResponse WR = (WebResponse) um.unmarshal(new FileReader("c:/tem/Response.XML")); System.out.println("StatusCode: " + WR.getStatusCode() + " Description " +WR.getDescription()); } } ``` package-info.java: ``` @XmlSchema(namespace = "http://example.com/service/request/v1",elementFormDefault=XmlNsForm.QUALIFIED) package com.example; import javax.xml.bind.annotation.*; ``` i used the solutions present in this site but could not solve please help

Original source