JAXB unmarshal返回非根元素

时间:2014-05-13 00:07:33

标签: java xml jaxb

我正在尝试使用JAXB Unmarshaller将xml文档转换为java对象树。

XML文档如下所示:

<Levels>
    <Level>
        <Solution>
            <Piece x="0" y="1">
                <Shape/>
                <Color/>
            </Piece>
            <Piece x="0" y="1">
                <Shape/>
                <Color/>
            </Piece>
        </Solution>
        <Clues>
            <Clue>
                <Piece x="0" y="0">
                    <Shape/>
                    <Color/>
                </Piece>
            </Clue>
            <Clue>
                <Piece x="0" y="0">
                    <Shape/>
                    <Color/>
                </Piece>
            </Clue>
        </Clues>
    </Level>
</Levels>

我创建了非常基本的类来保存每个组件:

Levels.java:

@XmlRootElement
public class Levels {

    private List<Level> levels = new ArrayList<Level>();

    @XmlElementRef(name="Level")
    public List<Level> getLevels() {
        return levels;
    }

    public void setLevels(List<Level> levels) {
        this.levels = levels;
    }
}

Level.java:

@XmlRootElement(name="Levels")
public class Level {

    private Solution solution = new Solution();
    private Clues clues = new Clues();

    @XmlElementRef(name="Solution")
    public Solution getSolution() {
            return solution;
    }

        public void setSolution(Solution solution) {
        this.solution = solution;
    }

    @XmlElementRef(name="Clues")
    public Clues getClues() {
        return clues;
    }

    public void setClues(Clues clues) {
        this.clues = clues;
    }
}

其余类的格式与这些相同(相同的注释,只有getter和setter方法)

我用来解组xml的代码是:

File file = new File("res/levelTest.xml");

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

Object o = jaxbUnmarshaller.unmarshal(file);        
System.out.println(o);

我遇到的问题是,当我打印对象时,它会打印newXML.Solution@***而不是newXML.Levels@***这是根元素。这意味着unmarshaller返回除根元素之外的元素。我搜索了谷歌和堆栈溢出但我无法找到解释。

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您的顶级班级名称和Level班级上的名称存在注释冲突。

您已将XmlElementRoot设置为&#34; Levels&#34;来注释您的Level课程,这实际上是您的Levels课程的根元素。由于您没有在该类的注释中明确指定它,因此JAXB绑定会为您的类返回不同的映射。

我创建了一个程序的快速模型,并且能够通过以下方式使其正常工作:

级别课程:

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


    private List<Level> levels = new ArrayList<Level>();

    @XmlElementRef(name="Level")
    public List<Level> getLevels() {
        return levels;
    }

    public void setLevels(List<Level> levels) {
        this.levels = levels;
    }
}

等级:

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

    private Solution solution = new Solution();
    private Clues clues = new Clues();

    @XmlElementRef(name="Solution")
    public Solution getSolution() {
        return solution;
    }

    public void setSolution(Solution solution) {
        this.solution = solution;
    }

    @XmlElementRef(name="Clues")
    public Clues getClues() {
        return clues;
    }

    public void setClues(Clues clues) {
        this.clues = clues;
    }
}

线索类(因为我只需要一个类定义而为空):

@XmlRootElement
public class Clues {
}

解决方案类(与上面相同):

@XmlRootElement
public class Solution {
}

使用您的输入运行代码会产生:

Levels@***