jaxb的实际应用

一、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>

 三、XmlRootElement、XmlElementRef(可以用于父类和子类之间)

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;

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, dog.getAddress().getClass());
        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>

 

四、 动态的生成根节点元素名称(JAXBElement)

package my.test.xml.aaaxml;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
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;
import javax.xml.namespace.QName;

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);
        QName qName = new QName("dogas");
        JAXBElement<Dog> dogElement = new JAXBElement<Dog>(qName, Dog.class, dog);
        marshaller.marshal(dogElement, 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;
    }

    @Override
    public String toString() {
        return "Dog [name=" + name + ", address=" + address + "]";
    }

}

@XmlSeeAlso({ Address2.class, Address1.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;
    }

    @Override
    public String toString() {
        return "Address1 [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;
    }

    @Override
    public String toString() {
        return "Address2 [city2=" + city2 + "]";
    }

}

 运行结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dogas>
    <name>godName</name>
    <address1>
        <city1>beijing</city1>
    </address1>
</dogas>

 五、动态的生成根节点元素名称和非根节点元素名称(JAXBElement、XmlRegistry、XmlElementRef、XmlElementDecl)

package my.test.xml.aaaxml;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.namespace.QName;

public class Test {

    public static void main(String[] args) throws Exception {

        Address1 address1 = new Address1();
        address1.setCity1("beijing");
        QName q1Name = new QName("addressas");
        JAXBElement<?> address1Element = new JAXBElement<Address1>(q1Name, Address1.class, address1);
        Address2 address2 = new Address2();
        address2.setCity2("beijing");
        Dog dog = new Dog();
        dog.setName("godName");
        dog.setAddress((JAXBElement<AbstractAddr>) address1Element);
        JAXBContext context = JAXBContext.newInstance(Dog.class, ObjectFactory.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        QName qName = new QName("dogas");
        JAXBElement<Dog> dogElement = new JAXBElement<Dog>(qName, Dog.class, dog);
        marshaller.marshal(dogElement, System.out);

    }

}

@XmlAccessorType(XmlAccessType.FIELD)
class Dog {

    private String name;

    @XmlElementRef(name = "address")
    private JAXBElement<AbstractAddr> address;

    public JAXBElement<AbstractAddr> getAddress() {
        return address;
    }

    public void setAddress(JAXBElement<AbstractAddr> address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog [name=" + name + ", address=" + address + "]";
    }

}

@XmlRegistry
class ObjectFactory {
    @XmlElementDecl(name = "address")
    public JAXBElement<AbstractAddr> createAddress() {
        return null;
    }
}

@XmlSeeAlso({ Address2.class, Address1.class })
class AbstractAddr {

}

class Address1 extends AbstractAddr {

    private String city1;

    public String getCity1() {
        return city1;
    }

    public void setCity1(String city1) {
        this.city1 = city1;
    }

    @Override
    public String toString() {
        return "Address1 [city1=" + city1 + "]";
    }

}

class Address2 extends AbstractAddr {

    private String city2;

    public String getCity2() {
        return city2;
    }

    public void setCity2(String city2) {
        this.city2 = city2;
    }

    @Override
    public String toString() {
        return "Address2 [city2=" + city2 + "]";
    }

}

运行结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dogas>
    <name>godName</name>
    <addressas>
        <city1>beijing</city1>
    </addressas>
</dogas>

 

转载于:https://www.cnblogs.com/erdanyang/p/10397438.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值