W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
既然使用 JAXBElement
可以動(dòng)態(tài)指定參數(shù)值,如果某個(gè)Java 字段使用該類型是否可以做到動(dòng)態(tài)生成XML子節(jié)點(diǎn)呢: Yes & No。
定義一個(gè)零食,第二個(gè)參數(shù)是 JAXBElement
的 水果,Fruit
在之前一定定義過了。
@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é)不需要在這里寫死,等下創(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)注在字段上,不過需要注意的是標(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è)試一下上面的寫法是否正確。
@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>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: