一、XmlElements的应用:(可用于子类和父类之间)
package my.test.xml.aaaxml; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElements; import javax.xml.bind.annotation.XmlRootElement; public class Test { public static void main(String[] args) throws Exception { Address1 address1 = new Address1(); address1.setCity1("beijing"); Address2 address2 = new Address2(); address2.setCity2("beijing"); Dog dog = new Dog(); dog.setName("godName"); dog.setAddress(address2); JAXBContext context = JAXBContext.newInstance(Dog.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(dog, System.out); } } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Dog { private String name; @XmlElements({ @XmlElement(name = "address1", type = Address1.class), @XmlElement(name = "address2", type = Address2.class), }) private Object address; public Object getAddress() { return address; } public void setAddress(Object address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } } @XmlAccessorType(XmlAccessType.FIELD) class Address1 { private String city1; public String getCity1() { return city1; } public void setCity1(String city1) { this.city1 = city1; } } @XmlAccessorType(XmlAccessType.FIELD) class Address2 { private String city2; public String getCity2() { return city2; } public void setCity2(String city2) { this.city2 = city2; } }
运行结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <dog> <name>godName</name> <address2> <city2>beijing</city2> </address2> </dog>
二、XmlElementRef、XmlSeeAlso、XmlRootElement的配合使用:
package my.test.xml.aaaxml; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSeeAlso; public class Test { public static void main(String[] args) throws Exception { Address1 address1 = new Address1(); address1.setCity1("beijing"); Address2 address2 = new Address2(); address2.setCity2("beijing"); Dog dog = new Dog(); dog.setName("godName"); dog.setAddress(address1); JAXBContext context = JAXBContext.newInstance(Dog.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(dog, System.out); } } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Dog { private String name; @XmlElementRef private AbstractAddr address; public AbstractAddr getAddress() { return address; } public void setAddress(AbstractAddr address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } } @XmlSeeAlso({ Address1.class, Address2.class }) class AbstractAddr { } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Address1 extends AbstractAddr { private String city1; public String getCity1() { return city1; } public void setCity1(String city1) { this.city1 = city1; } } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Address2 extends AbstractAddr { private String city2; public String getCity2() { return city2; } public void setCity2(String city2) { this.city2 = city2; } }
运行结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <dog> <name>godName</name> <address1> <city1>beijing</city1> </address1> </dog>