動(dòng)態(tài)子節(jié)點(diǎn)

2019-04-21 22:57 更新

動(dòng)態(tài)子節(jié)點(diǎn)

既然使用 JAXBElement 可以動(dòng)態(tài)指定參數(shù)值,如果某個(gè)Java 字段使用該類型是否可以做到動(dòng)態(tài)生成XML子節(jié)點(diǎn)呢: Yes & No。

定義一個(gè)零食,第二個(gè)參數(shù)是 JAXBElement 的 水果,Fruit在之前一定定義過(guò)了。

@XmlRootElement
public class Food {


    private String name;
    private JAXBElement<Fruit> element;
//  setters,getters
}   

這里還需要指定一個(gè) ObjectFactory,ObjectFactory 類型的類里面可以定義一些創(chuàng)建某種類型的對(duì)象的方法,@XmlRegistry 用于標(biāo)注在充當(dāng)ObjectFactory角色的類上,@XmlElementDecl 聲明對(duì)應(yīng)的元素定義,其方法的返回值需要是JAXBElement類型,并且它必須指定一個(gè)name,這個(gè)name自由賦值,這里指定為'ref1'備用。

customElement 方法我直接返回null,因?yàn)閷?shí)現(xiàn)細(xì)節(jié)不需要在這里寫(xiě)死,等下創(chuàng)建對(duì)象的時(shí)候再聲明。

@XmlRegistry
public class ObjectFactory {
    @XmlElementDecl(name = "ref1")
    public JAXBElement<Fruit> customElement(Fruit fruit){
        return null;
    }
}

Food中定義了 JAXBElement<Fruit>,需要使用 @XmlElementRef(name="ref1")關(guān)聯(lián)使用到了 ObjectFactory 哪個(gè)方法,可以把@XmlElementRef(name="ref1")標(biāo)注在對(duì)應(yīng)的setter/getter方法上,或者標(biāo)注在字段上,不過(guò)需要注意的是標(biāo)注在字段上,還需要指定@XmlAccessorType(XmlAccessType.FIELD).

我習(xí)慣將注解標(biāo)注在字段上,所以需要加@XmlAccessorType,如果加在get方法上就不需要加@XmlAccessorType.

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Food {


    private String name;
    @XmlElementRef(name="ref1")
    private JAXBElement<Fruit> element;
//  setters,getters
//  @XmlElementRef(name="ref1")
    public JAXBElement<Fruit> getElement() {
        return element;
    }
}

測(cè)試一下上面的寫(xiě)法是否正確。

    @Test
    public void test4() throws JAXBException {
        Fruit fruit = new Fruit();
        fruit.setColor("red");

        
        JAXBElement<Fruit> element = new JAXBElement<Fruit>(new QName("時(shí)令水果"), Fruit.class, fruit);
        Food food = new Food();
        food.setName("Some foods");
        food.setElement(element);

        
        JAXBContext context = JAXBContext.newInstance(Fruit.class,Food.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        
        marshaller.marshal(food, System.out);
    }

可以看到XML的子節(jié)點(diǎn)Fruit并不是之前指定的@XmlRootElement,而是測(cè)試代碼中設(shè)置的值。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<food>
    <name>Some foods</name>
    <時(shí)令水果>
        <color>red</color>
    </時(shí)令水果>
</food>

更改QName的值為‘生鮮水果’,發(fā)現(xiàn)生成的XML跟著變化。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<food>
    <name>Some foods</name>
    <生鮮水果>
        <color>red</color>
    </生鮮水果>
</food>
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)