我正在尝试使用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返回除根元素之外的元素。我搜索了谷歌和堆栈溢出但我无法找到解释。
感谢任何帮助。
答案 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@***