W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
已知:如果 @XmlRootElement
不指定參數(shù),則使用類名首字母小寫作為根節(jié)點,如果指定name
參數(shù)則使用其值作為根節(jié)點。
場景假設:XML的根節(jié)點需要根據(jù)業(yè)務場景變化,上例中的<水果>
可以是任何傳入的值,那么現(xiàn)有的方案無法實現(xiàn)這樣的場景。
解決辦法:需要使用到 JAXBElement
,它可以代指任意 XML Element,并且在其初始化時,需要指定幾個重要參數(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);
}
和上例的不同點在于編組的是 JAXBElement
,而不直接作用于 Fruit
,其第一個參數(shù) QName
就是指定根節(jié)點的名字,第二個參數(shù)指定需要編組的對象,第三個參數(shù)是真正的數(shù)據(jù)。要注意最后一行代碼,傳入的參數(shù)是 element
。
得到的結果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<新鮮水果>
<color>red</color>
</新鮮水果>
如果改一點代碼:
@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);
}
得到的結果就是代碼中設置的 QName
。其實在 Fruit
類上以已經(jīng)包含注解@XmlRootElement(name = "水果")
,這里設置的值直接覆蓋之前注解的name
。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<綠色水果>
<color>Green</color>
</綠色水果>
可能你已經(jīng)發(fā)現(xiàn)了,這里用到了GreenFruit
而不是之前的Fruit
,其實它們有相同的字段,只是 GreenFruit
直接沒有加注解 @XmlRootElement
,因為這個注解在這里所起的作用已經(jīng)被 JAXBElement<>
所替代了。
public class GreenFruit {
private String color;
// setters,getters
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: