java - JAXB 解码返回非根元素

标签 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@*** ,这是根元素。这意味着解码器返回根元素以外的元素。我搜索了谷歌和堆栈溢出,但找不到对此的解释。

感谢任何帮助。

最佳答案

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

您已将 XmlElementRoot 设置为“Levels”来注释 Level 类,这实际上是 Levels 类的根元素。由于您没有在该类的注释中显式指定它,因此 JAXB 绑定(bind)将为您的类返回不同的映射。

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

级别类别:

@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@***

关于java - JAXB 解码返回非根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620855/

相关文章:

java - 导入日期模式数据并忽略java中的其他字符串

android - 如何在 list 文件中注册应用程序类?

java - 不生成@XMLRootElement jaxb

xml - 替换各种 XML 文件中的字符串

java - JAXB 编码器无参数默认构造函数

Java JAXB 编码到 DOM 文档

java - Liquibase,当使用 "Migration Failed: Java heap space"生成ChangeLog 时出现 "data"错误

Java 类型推断在编译时失败,但 Eclipse 编译并运行得很好

java - 更改去电号码,添加前缀

xml - 如何在 XPATH 中乘以值?