W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
既然使用 JAXBElement
可以動態(tài)指定參數(shù)值,如果某個Java 字段使用該類型是否可以做到動態(tài)生成XML子節(jié)點(diǎn)呢: Yes & No。
定義一個零食,第二個參數(shù)是 JAXBElement
的 水果,Fruit
在之前一定定義過了。
@XmlRootElement
public class Food {
private String name;
private JAXBElement<Fruit> element;
// setters,getters
}
這里還需要指定一個 ObjectFactory
,ObjectFactory 類型的類里面可以定義一些創(chuàng)建某種類型的對象的方法,@XmlRegistry
用于標(biāo)注在充當(dāng)ObjectFactory角色的類上,@XmlElementDecl
聲明對應(yīng)的元素定義,其方法的返回值需要是JAXBElement類型,并且它必須指定一個name
,這個name自由賦值,這里指定為'ref1'備用。
customElement 方法我直接返回null,因為實現(xiàn)細(xì)節(jié)不需要在這里寫死,等下創(chuàng)建對象的時候再聲明。
@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
哪個方法,可以把@XmlElementRef(name="ref1")
標(biāo)注在對應(yīng)的setter/getter方法上,或者標(biāo)注在字段上,不過需要注意的是標(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;
}
}
測試一下上面的寫法是否正確。
@Test
public void test4() throws JAXBException {
Fruit fruit = new Fruit();
fruit.setColor("red");
JAXBElement<Fruit> element = new JAXBElement<Fruit>(new QName("時令水果"), 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
,而是測試代碼中設(shè)置的值。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<food>
<name>Some foods</name>
<時令水果>
<color>red</color>
</時令水果>
</food>
更改QName
的值為‘生鮮水果’,發(fā)現(xiàn)生成的XML跟著變化。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<food>
<name>Some foods</name>
<生鮮水果>
<color>red</color>
</生鮮水果>
</food>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: