W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
既然 XML 中的節(jié)點元素都是對應著 Java 類,可以利用繼承關系來動態(tài)生成 XML 元素。
‘商品信息’(Product.java)是之前用過的例子,它的第二個字段是引用類型:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
@XmlAttribute
private String id;
@XmlElementRef
private Fruit fruit;
// setters,getters
}
‘水果’(Fruit.java)只有一個字段,并且已經設置了別名@XmlRootElement(name = "水果")
:
@XmlRootElement(name = "水果")
public class Fruit {
private String color;
// setters,getters
}
‘水果1’()繼承了‘水果’,并且有一個特殊字段:
@XmlRootElement
public class Pomelo extends Fruit{
private String name;
// setters,getters
}
‘水果2’()繼承了‘水果’,并且有一個特殊字段:
@XmlRootElement
public class Watermelon extends Fruit{
private String shape;
// setters,getters
}
當商品信息是第一種水果時:
@Test
public void test5() throws JAXBException {
Pomelo pomelo = new Pomelo();
pomelo.setName("柚子");
pomelo.setColor("Orange");
Product product = new Product();
product.setFruit(pomelo);
product.setId("1205");
JAXBContext context = JAXBContext.newInstance(Product.class,Pomelo.class,Fruit.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(product, System.out);
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product id="1205">
<pomelo>
<color>Orange</color>
<name>柚子</name>
</pomelo>
</product>
換一種水果再看看:
@Test
public void test5_2() throws JAXBException {
Watermelon watermelon = new Watermelon();
watermelon.setShape("橢圓形");
watermelon.setColor("Green");
Product product = new Product();
product.setFruit(watermelon);
product.setId("1205");
JAXBContext context = JAXBContext.newInstance(Product.class,Watermelon.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(product, System.out);
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product id="1205">
<watermelon>
<color>Green</color>
<shape>橢圓形</shape>
</watermelon>
</product>
商品信息每次根據不同的子商品而變化,之前已經設置過的主商品
Fruit
已經不能影響最終結果。
需要注意的是,這里不能直接使用靜態(tài)工具類JAXB
,下面的方式生成的結果不正確:
@Test
public void test5_3() throws JAXBException {
Watermelon watermelon = new Watermelon();
watermelon.setShape("橢圓形");
watermelon.setColor("Green");
Product product = new Product();
product.setFruit(watermelon);
product.setId("1205");
JAXB.marshal(product, System.out);
}
得到的 XML 和之前的預期不一致:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product id="1205">
<水果>
<color>Green</color>
</水果>
</product>
因為 JAXB 工具類在注冊
newInstance
時,只關注第一個參數(shù)JAXB.marshal(object, out)
,而這里的第一個參數(shù)是Product,因此不能注冊Fruit的子類 Watermelon,所有與 Watermelon 相關的設置都不能成功,不過這里與父類 Fruit 相關的設置都生效了。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: