Search code examples
javaxmlunmarshallingjaxb2

JAXB unmarshall issue


I've to parse the following xml in a Java object:

<ArrayOfTranslateArrayResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<TranslateArrayResponse>
    <From>it</From>
    <OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:int>5</a:int>
    </OriginalTextSentenceLengths>
    <TranslatedText>Mom</TranslatedText>
    <TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:int>3</a:int>
    </TranslatedTextSentenceLengths>
</TranslateArrayResponse>
<TranslateArrayResponse>
    <From>it</From>
    <OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:int>4</a:int>
    </OriginalTextSentenceLengths>
    <TranslatedText>Dad</TranslatedText>
    <TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:int>3</a:int>
    </TranslatedTextSentenceLengths>
</TranslateArrayResponse>

This the two class I've implemented:

@XmlRootElement(name="ArrayOfTranslateArrayResponse")
@XmlAccessorType(XmlAccessType.FIELD)
@Getter
@Setter
@ToString
public class TranslateResponse {

    @XmlElement(name="TranslateArrayResponse")
    private LinkedList<TranslatedResponseObject> translations;

}

and

@XmlAccessorType(XmlAccessType.FIELD)
@Getter
@Setter
@ToString
public class TranslatedResponseObject {

    @XmlElement(name="TranslatedText")
    private String translatedText;


}

With the unmarshall of the xml example provided, I received null for the field translations. What is wrong?


Solution

  • I've got the solutions, thanks to @klonq suggestion to debug the issue. It was necessary to add the namespace on each @XmlElement and @XmlRootElement, in this way:

    @XmlRootElement(name="ArrayOfTranslateArrayResponse", namespace="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2")
    @XmlAccessorType(XmlAccessType.FIELD)
    @Getter
    @Setter
    @ToString
    public class TranslateResponse {
    
        @XmlElement(name="TranslateArrayResponse", namespace="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2")
        private LinkedList<TranslatedResponseObject> translations;
    
    }
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @Getter
    @Setter
    @ToString
    public class TranslatedResponseObject {
    
        @XmlElement(name="TranslatedText", namespace="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2")
        private String translatedText;
    
    
    }