簡單動態(tài)XML

2018-12-31 21:01 更新

關(guān)于簡單動態(tài)XML

有一點(diǎn)需要注意,之前所有指定的字段都指定了數(shù)據(jù),但是如果不指定數(shù)據(jù),就能生成不一樣的XML

    @Test
    public void test4() throws JAXBException {
        Product p1 = new Product();
        p1.setId("11041");

        
        Product p2 = new Product();
        p2.setId("11042");
        p2.setName("Grape");

        
        List<Product> list = Arrays.asList(p1,p2);

        
        Order3 order = new Order3();
        order.setId("1104");
        order.setProduct(list);

        
        JAXBContext context = JAXBContext.newInstance(Order3.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        
        marshaller.marshal(order, System.out);
    }

生成的XML只包含上面指定數(shù)據(jù)的字段。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Order>
    <id>1104</id>
    <Products>
        <product id="11041"/>
        <product id="11042">
            <name>Grape</name>
        </product>
    </Products>
</Order>

動態(tài) XML Element

有時(shí)候,Products元素下面并不只是加入 product ,可能動態(tài)加入這種商品。 這次的模擬的商品是糕點(diǎn)與餅干。

這里的 Cake 只包含一個(gè)字段,需要注意的是 @XmlRootElement不能少。

@XmlRootElement(name = "Cake")
public class Cake {
    private String name;
    //setters, getters
}

這里的 Biscuit 也只包含一個(gè)字段。

@XmlRootElement(name = "Biscuit")
public class Biscuit {
    private String name;
    //setters, getters
}

Order的第三個(gè)字段是List,但是沒有指定一個(gè)特定對象,用了Object代指所有,還有一個(gè)@XmlAnyElement是最重要的注解,用來標(biāo)注所有的Element。

@XmlRootElement(name = "Order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order4 {


    private String id;
    private Double price;
    @XmlElementWrapper(name = "Products")
    @XmlAnyElement
    private List<Object> product;
    //setters, getters
}

    

下面用來模擬數(shù)據(jù)生成,注意的是JAXBContext需要注冊所有需要編組的Java bean。這一點(diǎn)和之前的例子是不同的。

    @Test
    public void test4() throws JAXBException {
        Cake cake = new Cake();
        cake.setName("Nobel");

        
        Biscuit biscuit = new Biscuit();
        biscuit.setName("PB");

        
        List<Object> list = Arrays.asList(cake,biscuit);

        
        Order4 order = new Order4();
        order.setId("1104");
        order.setProduct(list);

        
        JAXBContext context = JAXBContext.newInstance(Order4.class, Cake.class, Biscuit.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        
        marshaller.marshal(order, System.out);
    }

生成的XML包含了一個(gè) Products ,其數(shù)據(jù)結(jié)構(gòu)在Order中并沒有指定,方便后期擴(kuò)展。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Order>
    <id>1104</id>
    <Products>
        <Cake>
            <name>Nobel</name>
        </Cake>
        <Biscuit>
            <name>PB</name>
        </Biscuit>
    </Products>
</Order>

XML 動態(tài) Attribute

與動態(tài)Element對應(yīng)的是Attribute,不過需要注意的是,動態(tài) Attribute 需要的是 Map ,而且其 key 的類型需要指定為 QName,這個(gè)QName在復(fù)雜的 XML 生成時(shí)有很大用處。一般使用到的是其QName(name),它還有一個(gè)形式為QName(name,namespace),可以指定命名空間,在某些場景下有不可替代的作用。

@XmlRootElement(name = "Order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order5 {
    @XmlAnyAttribute
    private Map<QName, String> properties;
    private Product product;
    //setters, getters
}

    @Test
    public void test5() throws JAXBException {
        Product p = new Product();
        p.setId("1100");
        p.setName("Apple");

        
        Map<QName, String> map = new HashMap<>();
        map.put(new QName("id"), "1105");
        map.put(new QName("classification"), "food");
        map.put(new QName("type"), "fruit");

        
        Order5 order = new Order5();
        order.setProduct(p);
        order.setProperties(map);

        
        JAXBContext context = JAXBContext.newInstance(Order5.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        
        marshaller.marshal(order, System.out);
    }

僅關(guān)注 Order 的 Attribute , 可以發(fā)現(xiàn)我們在 Order 中沒有指定任何與之相關(guān)的字段,只是在HashMap中加了幾組數(shù)據(jù),現(xiàn)在編組成為了Attribute。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Order id="1105" classification="food" type="fruit">
    <product id="1100">
        <name>Apple</name>
    </product>
</Order>
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號