选择性编组对象

时间:2018-03-04 18:30:32

标签: java xml jaxb

我需要执行一个选择性编组对象。例如:

有一个课程联系

@XmlRootElement(name = "contact")
public class Contact {

    private String name;
    private String number;
    private String address;

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

编组对象:

public static void main(String[] args) throws JAXBException {    
        Contact contact = new Contact();
        contact.setAddress("5 Av.");
        contact.setName("John");
        contact.setNumber("5555555");    

        JAXBContext context = JAXBContext.newInstance(Contact.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(contact, System.out);
    }

结果我们有:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact>
    <address>5 street</address>
    <name>John</name>
    <number>5555555</number>
</contact>

有没有简单的方法来执行选择性编组?例如,只有要输出的地址:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact>
    <address>5 street</address>
</contact>

谢谢!

1 个答案:

答案 0 :(得分:0)

如果未指定,则默认为 - 如果类上有以下注释:

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)

这意味着JAXB将使用所有公共成员,即所有getter方法。

您可以保留默认值并取消您不想要的getter方法,也可以更改默认值并明确标记您想要处理的getter方法。

要抑制getter方法,请使用@XmlTransient注释:

  

阻止将JavaBean属性/类型映射到XML表示。

要更改默认值,请使用@XmlAccessorType(XmlAccessType.NONE)注释:

  

除非使用某些JAXB注释对其进行专门注释,否则所有字段或属性都不会绑定到XML。

然后使用@XmlElement明确注释所需的getter方法:

  

将JavaBean属性映射到从属性名称派生的XML元素。

使用@XmlTransient

@XmlRootElement(name = "contact")
class Contact {

    private String name;
    private String number;
    private String address;

    @XmlTransient
    public String getName() {
        return name;
    }

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

    @XmlTransient
    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

使用@XmlAccessorType(XmlAccessType.NONE)

@XmlRootElement(name = "contact")
@XmlAccessorType(XmlAccessType.NONE)
class Contact {

    private String name;
    private String number;
    private String address;

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    @XmlElement
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

输出(来自两者)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact>
    <address>5 Av.</address>
</contact>