Java HTML / XML How to - Use JAXB @XmlAdapter for arbitrary XML








Question

We would like to know how to use JAXB @XmlAdapter for arbitrary XML.

Answer

//from  w  ww  .  ja va 2 s  .c om
import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

class BarAdapter extends XmlAdapter<Object, Bar> {
  private DocumentBuilder documentBuilder;

  public BarAdapter() {
    try {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      documentBuilder = dbf.newDocumentBuilder();
    } catch (Exception e) {
    }
  }
  @Override
  public Bar unmarshal(Object v) throws Exception {
    Bar bar = new Bar();
    Element element = (Element) v;
    bar.value = element.getTextContent();
    return bar;
  }
  @Override
  public Object marshal(Bar v) throws Exception {
    Document document = documentBuilder.newDocument();
    Element root = document.createElement("bar");
    root.setTextContent(v.value);
    return root;
  }
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Foo {
  @XmlJavaTypeAdapter(BarAdapter.class)
  private Bar bar;
}
@XmlAccessorType(XmlAccessType.FIELD)
class Bar {
  String value;
}
public class Main {
  public static void main(String[] args) throws Exception {
    JAXBContext jc = JAXBContext.newInstance(Foo.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    File xml = new File("data.xml");
    Foo foo = (Foo) unmarshaller.unmarshal(xml);

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setAdapter(new BarAdapter());
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(foo, System.out);
  }
}