codecamp

利用继承关系

利用继承关系

既然 XML 中的节点元素都是对应着 Java 类,可以利用继承关系来动态生成 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已经不能影响最终结果。

需要注意的是,这里不能直接使用静态工具类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时,只关注第一个参数JAXB.marshal(object, out),而这里的第一个参数是Product,因此不能注册Fruit的子类 Watermelon,所有与 Watermelon 相关的设置都不能成功,不过这里与父类 Fruit 相关的设置都生效了。

动态子节点
Java 对象中含有 List
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

JAXB 简单转化案例

JAXB 之 Trang

简单XML生成——Marshaller数据源

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }