Java tutorial
import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; public class Main { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(BarX.class, BarY.class); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); BarX barX = new BarX(); barX.setXThing("XThing"); marshaller.marshal(barX, System.out); BarY barY = new BarY(); barY.setYBlah("YBlah"); marshaller.marshal(barY, System.out); } @XmlRootElement @XmlType(propOrder = { "YBlah" }) public static class BarY extends Foo { @XmlElement(name = "blah") public String getYBlah() { return name; } public void setYBlah(String blah) { name = blah; } } @XmlTransient public static abstract class Foo { protected String name; } @XmlRootElement @XmlType(propOrder = { "XThing" }) public static class BarX extends Foo { @XmlElement(name = "thing") public String getXThing() { return name; } public void setXThing(String thing) { name = thing; } } }