Java HTML / XML How to - Use JAXB: empty tags with no xsi:nil








Question

We would like to know how to use JAXB: empty tags with no xsi:nil.

Answer

//from   w  w w.  j a  va  2 s.c o  m
import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

class StringAdapter extends XmlAdapter<StringAdapter.AdaptedString, String> {

  @Override
  public String unmarshal(AdaptedString adaptedString) throws Exception {
    if (null == adaptedString) {
      return null;
    }
    String string = adaptedString.value;
    if ("".equals(string)) {
      return null;
    }
    return string;
  }

  @Override
  public AdaptedString marshal(String string) throws Exception {
    AdaptedString adaptedString = new AdaptedString();
    adaptedString.value = string;
    return adaptedString;
  }

  public static class AdaptedString {
    @XmlValue
    public String value;
  }

}

@XmlRootElement(name = "Root")
class Root {
  String item;

  @XmlElement(name = "Item", required = true, nillable = true)
  @XmlJavaTypeAdapter(StringAdapter.class)
  public String getItem() {
    return item;
  }
  public void setItem(String item) {
    this.item = item;
  }
}

public class Main {
  JAXBContext jc;

  public Main() throws JAXBException {
    jc = JAXBContext.newInstance(Root.class);
  }

  public static void main(String[] args) throws Exception {
    Main demo = new Main();
    demo.demo("<Root><Item/></Root>");
    demo.demo("<Root><Item>Hello World</Item></Root>");
  }

  private void demo(String xml) throws JAXBException {
    StringReader stringReader = new StringReader(xml);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    Root root = (Root) unmarshaller.unmarshal(stringReader);

    System.out.println("ITEM:   " + root.getItem());

    System.out.print("OUTPUT: ");
    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
    marshaller.marshal(root, System.out);
  }
}