无法按预期从java类生成所需的XML。
这是一个定义zoo
属性的类**//Modal Class**
public class Zoo
{
private String name;
private String place;
//Getters Setters
}
动态类,包含要在XML中的zoo类列表
//具有多个zoo类对象的Action类
@ManagedBean
@XmlRootElement
public @SessionScoped class zoos implements Serializable {
private String name;
private String place;
private static final ArrayList<Zoo> zoo_list
= new ArrayList<Zoo>();
@XmlElement
public ArrayList<Zoo> getZoo_list()
{
return zoo_list;
}
public void xmleg()
{
File file = new File("C:\\file.xml");
for(Zoo add: zoo_list)
{
try
{
JAXBContext jaxbContext = JAXBContext.newInstance(Zoos.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(new JAXBElement<Zoo>(new QName("","Zoo"),zoo.class,add),file);
jaxbMarshaller.marshal(new JAXBElement<Zoo>(new QName("","Zoo"),zoo.class,add),System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
生成的输出是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
<linkId>0</linkId>
<name>gfdsgdgtretr</name>
<place>gdfg</place>
</zoo>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
<linkId>0</linkId>
<name>gfdsgdgtretr</name>
<place>gdfg</place>
</zoo>
但预期输出应为:
<zoos>
<zoo>
<linkId>0</linkId>
<name>gfdsgdgtretr</name>
<place>gdfg</place>
</zoo>
<zoo>
<linkId>0</linkId>
<name>gfdsgdgtretr</name>
<place>gdfg</place>
</zoo>
</zoos>
也试过了@XMLElementWrapper注释,但它也没有用。虽然经历了很多教程,但没有找到解决方案。
答案 0 :(得分:1)
<强>更新强>
我刚刚重读了您的问题,您已经拥有Zoos
课程。您应该编组该实例而不是zoo_list
属性中的单个项目。您可以使用@XmlElement
注释更改属性映射到的元素名称。
@XmlElement(name="zoo")
public ArrayList<Zoo> getZoo_list()
JAXB(JSR-222)实现需要根对象。最简单的方法是创建一个名为Zoos
的对象,该对象保存在Zoo
对象列表中并编组该对象。
@XmlRootElement
public class Zoos {
private List<Zoo> zoo;
public List<Zoo> getZoo() {
return zoo;
}
public void setZoo(List<Zoo> zoo) {
this.zoo = zoo;
}
}
或者,您可以为FileWriter
创建File
。然后你可以自己编写start元素。然后使用JAXB将每个Zoo
实例封送到FileWriter
(您需要利用以下属性让JAXB排除XML标头。
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
最后,您需要关闭根元素。