我正在尝试使用 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/