【问题标题】:JAXB unmarshal returns non-root elementJAXB 解组返回非根元素
【发布时间】:2014-05-13 00:07:32
【问题描述】:

我正在尝试使用 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@*** 这是根元素。这意味着解组器正在返回根元素以外的元素。我已经搜索了谷歌和堆栈溢出,但我找不到对此的解释。

感谢任何帮助。

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

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

    您已将 XmlElementRoot 设置为“Levels”来注释您的 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@***
    

    【讨论】:

    • 非常感谢!我的印象是所有的 @XmlRootElement 注释都应该指向根。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多