1、取消xsi和xmlns
在变量标注@XmlElementRef即可
(1)添加前
<a>
<p xsi:type="student" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>hs</name>
<age>11</age>
</p>
</a>
(2)添加后
<a>
<p>
<name>hs</name>
<age>11</age>
</p>
</a>
2、继承
在基类上标注@XmlSeeAlso({Student.class, Teacher.class}),并指明子类即可
3、自定义头部
在输出时,自己把头部写进去,这样他会引用你自己写的head(前提设置Marshaller.JAXB_FRAGMENT为true)。
详情见下面代码:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
@XmlElementRef
private People p;
public People getP() {
return p;
}
public void setP(People p) {
this.p = p;
}
}
import javax.xml.bind.annotation.XmlSeeAlso;
@XmlSeeAlso({Student.class, Teacher.class})
public class People {
}
import jdk.nashorn.internal.objects.annotations.Getter;
import jdk.nashorn.internal.objects.annotations.Setter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Student extends People {
@XmlElement(name = "name")
private String name;
@XmlElement(name = "age")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Teacher extends People{
@XmlElement
private String dada;
public String getDada() {
return dada;
}
public void setDada(String dada) {
this.dada = dada;
}
}
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
public class Test {
public static void main(String[] args) throws JAXBException {
A a = new A();
Student s = new Student();
s.setAge(11);
s.setName("hs");
a.setP(s);
JAXBContext context = JAXBContext.newInstance(A.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
marshaller.marshal(a, writer);
System.out.println(writer.toString());
}
}