W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
已知:如果 @XmlRootElement
不指定參數(shù),則使用類名首字母小寫作為根節(jié)點(diǎn),如果指定name
參數(shù)則使用其值作為根節(jié)點(diǎn)。
場(chǎng)景假設(shè):XML的根節(jié)點(diǎn)需要根據(jù)業(yè)務(wù)場(chǎng)景變化,上例中的<水果>
可以是任何傳入的值,那么現(xiàn)有的方案無(wú)法實(shí)現(xiàn)這樣的場(chǎng)景。
解決辦法:需要使用到 JAXBElement
,它可以代指任意 XML Element,并且在其初始化時(shí),需要指定幾個(gè)重要參數(shù)。
@Test
public void test2() throws JAXBException {
Fruit fruit = new Fruit();
fruit.setColor("red");
JAXBElement<Fruit> element = new JAXBElement<Fruit>(new QName("新鮮水果"), Fruit.class, fruit);
JAXB.marshal(element, System.out);
}
和上例的不同點(diǎn)在于編組的是 JAXBElement
,而不直接作用于 Fruit
,其第一個(gè)參數(shù) QName
就是指定根節(jié)點(diǎn)的名字,第二個(gè)參數(shù)指定需要編組的對(duì)象,第三個(gè)參數(shù)是真正的數(shù)據(jù)。要注意最后一行代碼,傳入的參數(shù)是 element
。
得到的結(jié)果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<新鮮水果>
<color>red</color>
</新鮮水果>
如果改一點(diǎn)代碼:
@Test
public void test2_2() throws JAXBException {
GreenFruit fruit = new GreenFruit();
fruit.setColor("Green");
JAXBElement<GreenFruit> element = new JAXBElement<GreenFruit>(new QName("綠色水果"), GreenFruit.class, fruit);
JAXB.marshal(element, System.out);
}
得到的結(jié)果就是代碼中設(shè)置的 QName
。其實(shí)在 Fruit
類上以已經(jīng)包含注解@XmlRootElement(name = "水果")
,這里設(shè)置的值直接覆蓋之前注解的name
。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<綠色水果>
<color>Green</color>
</綠色水果>
可能你已經(jīng)發(fā)現(xiàn)了,這里用到了GreenFruit
而不是之前的Fruit
,其實(shí)它們有相同的字段,只是 GreenFruit
直接沒有加注解 @XmlRootElement
,因?yàn)檫@個(gè)注解在這里所起的作用已經(jīng)被 JAXBElement<>
所替代了。
public class GreenFruit {
private String color;
// setters,getters
}
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)系方式:
更多建議: