以下是用例:
@XmlRootElement
public class Book {
public String title;
public Book(String t) {
this.title = t;
}
}
@XmlRootElement
@XmlSeeAlso({Book.class})
public class Books extends ArrayList<Book> {
public Books() {
this.add(new Book("The Sign of the Four"));
}
}
然后,我正在做:
JAXBContext ctx = JAXBContext.newInstance(Books.class);
Marshaller msh = ctx.createMarshaller();
msh.marshal(new Books(), System.out);
这就是我所看到的:
<?xml version="1.0"?>
<books/>
我的书在哪里? :)
答案 0 :(得分:15)
要编组的元素必须是公共的,或者具有XMLElement anotation。 ArrayList类和您的类Books与这些规则中的任何一个都不匹配。 您必须定义一个方法来提供Book值,并对其进行分析。
在您的代码上,只更改您的Books类,添加“自我吸气”方法:
@XmlRootElement
@XmlSeeAlso({Book.class})
public class Books extends ArrayList<Book> {
public Books() {
this.add(new Book("The Sign of the Four"));
}
@XmlElement(name = "book")
public List<Book> getBooks() {
return this;
}
}
当您运行编组代码时,您将获得:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books><book><title>The Sign of the Four</title></book></books>
(为了清晰起见,我添加了换行符)
答案 1 :(得分:2)
我认为你不能轻易地对List
进行战斗。考虑使用另一个类来包装列表。以下工作:
@XmlType
class Book {
public String title;
public Book() {
}
public Book(String t) {
this.title = t;
}
}
@XmlType
class Books extends ArrayList<Book> {
public Books() {
this.add(new Book("The Sign of the Four"));
}
}
@XmlRootElement(name = "books")
class Wrapper {
public Books book = new Books();
}
使用如下:
JAXBContext ctx = JAXBContext.newInstance(Wrapper.class);
Marshaller msh = ctx.createMarshaller();
msh.marshal(new Wrapper(), System.out);
它产生了这个结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books><book><title>The Sign of the Four</title></book></books>
答案 2 :(得分:0)
正如@Blaise和@musiKk所指出的那样,最好只是在书籍中设置书籍列表,并允许书籍成为真正的根元素。我不认为在我自己的代码中扩展ArrayList是一个可接受的过程。