動態(tài)根節(jié)點

2019-01-04 19:58 更新

動態(tài)根節(jié)點

已知:如果 @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
}
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號