How would I marshal a List of Jaxb Elements without making a wrapper class?
If you don't want to create a wrapper class you could convert the collection into an array, place that array in a JAXBElement
and then marshal it.
For example:
public class JAXBArrayWriter {
public static class Item {
@XmlValue
protected String value;
public Item() {}
public Item(String value) {
this.value = value;
}
}
public static void main (String [] args) throws Exception {
List<Item> items = new ArrayList<Item>();
items.add(new Item("one"));
items.add(new Item("two"));
JAXBContext jc = JAXBContext.newInstance(Item[].class);
JAXBElement<Item[]> root = new JAXBElement<Item[]>(new QName("items"),
Item[].class, items.toArray(new Item[items.size()]));
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(root, writer);
System.out.println(writer.toString());
}
}
which produces the following document:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
<item>one</item>
<item>two</item>
</items>
Please try this:
First, create a list class:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class AmenityList {
@XmlElement(name = "amenity")
List<Amenity> amenities = new ArrayList<Amenity>();
public AmenityList() {}
public void setList(List<Amenity> amenities) {
this.amenities = amenities;
}
}
then the Amenity class:
@XmlAccessorType(XmlAccessType.FIELD)
class Amenity {
private String amenityName;
private String amenityDate;
public Amenity(String name, String date) {
this.amenityName = name;
this.amenityDate = date;
}
}
set where needed your amenities in a list - maybe in a less redundant way :) - and assign it to an AmenityList:
AmenityList amenityList = new AmenityList();
List <Amenity> amenities = new ArrayList<Amenity>();
amenities.add(new Amenity("a_one", "today"));
amenities.add(new Amenity("a_two", "tomorrow"));
amenity.setList(amenities);
and finally, a toXml method:
public static String toXml(AmenityList amenityList) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(AmenityList.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(amenityList, sw);
return sw.toString()
}
obtaining, i.e. :
<amenityList>
<amenity>
<amenityName>a_one</amenityName>
<amenityDate>today</amenityDate>
</amenity>
<amenity>
<amenityName>a_two</amenityName>
<amenityDate>tomorrow</amenityDate>
</amenity>
</amenityList>