如何从xml为jaxb创建一个pojo(Unmarshalling)

时间:2017-12-05 15:14:53

标签: java xml jaxb

<?xml version="1.0" encoding="UTF-8"?>

<STATUS_UPDATE>
    <UPDATES_COUNTER>2</UPDATES_COUNTER>
    <LETTERS>
        <LETTER>
            <LETTER_KEY>key1</LETTER_KEY>
            <STATUS>status1</STATUS>
        </LETTER>
        <LETTER>
            <LETTER_KEY>key2</LETTER_KEY>
            <STATUS>status2</STATUS>
        </LETTER>
    </LETTERS>
</STATUS_UPDATE>

所以我有这个xml。我试图从中创造一个pojo。

@XmlRootElement(name = "STATUS_UPDATE")
public class StatusUpdate {

    private int updatesCounter;


    List<Letter> letters;

    public StatusUpdate(){
        letters = new ArrayList<Letter>();
    }

    public StatusUpdate(int updatesCounter, List<Letter> letters){
        super();
        this.updatesCounter = updatesCounter;
        this.letters =  letters;
    }

    @XmlElement(name="LETTERS")
    public List<Letter> getLetters() {
        return letters;
    }

    public void setLetters(List<Letter> letters) {
        this.letters = letters;
    }
    @XmlElement(name="UPDATES_COUNTER")
    public int getUpdatesCounter() {
        return updatesCounter;
    }

    public void setUpdatesCounter(int updatesCounter) {
        this.updatesCounter = updatesCounter;
    }

}

和信类

@XmlRootElement(name = "LETTER")
public class Letter {


    public Letter(){

    }

    public Letter(String letterKey,String status){
        this.letterKey = letterKey;
        this.status = status;
    }
    String letterKey;
    String status;

    @XmlElement(name="LETTER_KEY")
    public String getLetterKey() {
        return letterKey;
    }
    public void setLetterKey(String letterKey) {
        this.letterKey = letterKey;
    }
    @XmlElement(name="STATUS")
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

这个代码片段似乎无法完成这项工作。 我没有错误,代码运行,我的updateCounter变量得到2, 但是我的列表是空的,只有一个字母对象,两个变量都为空。

File file = new File("myFile.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(StatusUpdate.class ); 
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
StatusUpdate msgObject = (StatusUpdate) jaxbUnmarshaller.unmarshal(file);

我一直在阅读文档和示例,但是大多数都是为了匹配变量名和xml elemenets(我不想要)或者对我没有帮助。 有任何想法吗?我有一种感觉,我非常接近我的目标,但我似乎无法掌握我所缺少的东西。

1 个答案:

答案 0 :(得分:0)

您需要将@XmlElementWrapper(name = "LETTERS")注释添加到getLetters()方法,例如

@XmlElementWrapper(name = "LETTERS")
@XmlElement(name = "LETTER")
public List<Letter> getLetters() {
    return letters;
}