Java HTML / XML How to - Unmarshall nested list of xml items using JAXB








Question

We would like to know how to unmarshall nested list of xml items using JAXB.

Answer

/*from w ww .jav  a 2  s . c  o  m*/
import java.io.StringReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

public class Main {
  public static void main(String[] args) throws Exception {
    List<Element> elementList = new ArrayList<Element>();
    List<Item> itemList = new ArrayList<Item>();
    Element element1 = new Element();
    Element element2 = new Element();
    Item item1 = new Item();
    Item item2 = new Item();
    Elements elements = new Elements();

    item1.setId(1);
    item1.setName("Test1");
    item2.setId(2);
    item2.setName("Test2");
    itemList.add(item1);
    itemList.add(item2);

    element1.setProperty1("prop1");
    element1.setProperty2("prop2");
    element1.setType(2);
    element1.setItems(itemList);

    element2.setProperty1("prop11");
    element2.setProperty2("prop22");
    element2.setType(22);
    element2.setItems(itemList);

    elementList.add(element1);
    elementList.add(element2);

    elements.setElements(elementList);

    System.out.println("------- Object to XML -----------\n");
    JAXBContext jaxbContext = JAXBContext.newInstance(Elements.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

    // output pretty printed
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    jaxbMarshaller.marshal(elements, System.out);

    System.out.println("\n------- XML to Object -----------\n");

    String xml = "<elements><element><items><item><id>1</id><name>Test1</name></item><item><id>2</id><name>Test2</name></item></items><property1>prop1</property1><property2>prop2</property2><type>2</type></element><element><items><item><id>1</id><name>Test1</name></item><item><id>2</id><name>Test2</name></item></items><property1>prop11</property1><property2>prop22</property2><type>22</type></element></elements>";
    StringReader reader = new StringReader(xml);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    Elements elementsOut = (Elements) jaxbUnmarshaller.unmarshal(reader);
    System.out.println(elementsOut);

  }

  @XmlRootElement(name = "elements")
  public static class Elements {

    List<Element> elements;

    @XmlElement(name = "element")
    public List<Element> getElements() {
      return elements;
    }

    public void setElements(List<Element> elements) {
      this.elements = elements;
    }

    @Override
    public String toString() {
      Field[] fields = this.getClass().getDeclaredFields();
      String res = "";
      try {
        for (Field field : fields) {
          res += field.getName() + " :\n" + field.get(this);
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

      return res;
    }
  }

  public static class Element {

    Integer type;
    String property1;
    String property2;
    List<Item> items;

    public Integer getType() {
      return type;
    }

    public void setType(Integer type) {
      this.type = type;
    }

    public String getProperty1() {
      return property1;
    }

    public void setProperty1(String property1) {
      this.property1 = property1;
    }

    public String getProperty2() {
      return property2;
    }

    public void setProperty2(String property2) {
      this.property2 = property2;
    }

    @XmlElementWrapper(name = "items")
    @XmlElement(name = "item")
    public List<Item> getItems() {
      return items;
    }

    public void setItems(List<Item> items) {
      this.items = items;
    }

    @Override
    public String toString() {
      Field[] fields = this.getClass().getDeclaredFields();
      String res = "\n";
      try {
        for (Field field : fields) {
          res += field.getName() + " : " + field.get(this) + "\n";
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

      return res;
    }
  }

  public static class Item {
    Integer id;
    String name;

    public Integer getId() {
      return id;
    }

    public void setId(Integer id) {
      this.id = id;
    }

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    @Override
    public String toString() {
      Field[] fields = this.getClass().getDeclaredFields();
      String res = "{";
      try {
        for (Field field : fields) {
          res += field.getName() + " : " + field.get(this);
        }
        res += "}";
      } catch (Exception e) {
        e.printStackTrace();
      }

      return res;
    }
  }
}