对象嵌套转化为XML
1. 简单对象嵌套
Order实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Order {
private Integer id;
private Double price;
private Product product;
...... get/set 方法
}
Product实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
@XmlAttribute
private Integer id;
private String name;
...... get/set 方法
}
生成XML方法:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class testOrderDemo {
public static void main(String[] args) throws JAXBException {
Product p = new Product();
p.setId(1);
p.setName("Apple");
Order order = new Order();
order.setId(1);
order.setPrice(23.45);
order.setProduct(p);
JAXBContext context = JAXBContext.newInstance(Order.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(order, System.out);
}
}
XML结果:
2. 含有List类型对象
Product实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.*;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
@XmlAttribute
private Integer id;
private String name;
...... get/set方法
}
(1)循环数据不被包裹
Order2实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
public class Order2 {
private Integer id;
private Double price;
private List<Product> product;
...... get/set 方法
}
生成XML方法:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;
public class testOrderDemo2 {
public static void main(String[] args) throws JAXBException {
Product p1 = new Product();
p1.setId(1);
p1.setName("Apple");
Product p2 = new Product();
p2.setId(2);
p2.setName("Banana");
List<Product> list = Arrays.asList(p1,p2);
Order2 order = new Order2();
order.setId(1);
order.setPrice(45.67);
order.setProduct(list);
JAXBContext context = JAXBContext.newInstance(Order2.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(order, System.out);
}
}
XML结果:
(2)循环数据被包裹
Order3实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Order3 {
private Integer id;
private Double price;
@XmlElementWrapper(name = "Products")
private List<Product> product;
...... get/set 方法
}
在实体类中的List属性上面添加@XmlElementWrapper时必须在该类上添加@XmlAccessorType(XmlAccessType.FIELD)注解,否则会报下面异常:
生成XML方法:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;
public class testOrderDemo3 {
public static void main(String[] args) throws JAXBException {
Product p1 = new Product();
p1.setId(1);
p1.setName("Apple");
Product p2 = new Product();
p2.setId(2);
p2.setName("Banana");
List<Product> list = Arrays.asList(p1,p2);
Order3 order = new Order3();
order.setId(1);
order.setPrice(45.67);
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结果:
3. 简单动态XML
(1)生成的XML只包含指定数据的字段.如果不指定数据,就能生成不一样的XML
Product实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.*;
import java.util.List;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
@XmlAttribute
private Integer id;
private String name;
...... get/set 方法
}
Order3实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Order3 {
private Integer id;
private Double price;
@XmlElementWrapper(name = "Products")
private List<Product> product;
...... get/set 方法
}
生成XML方法:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;
public class testOrderDemo4 {
public static void main(String[] args) throws JAXBException {
Product p1 = new Product();
p1.setId(1);
Product p2 = new Product();
p2.setId(2);
p2.setName("Banana");
List<Product> list = Arrays.asList(p1,p2);
Order3 order = new Order3();
order.setId(1);
order.setPrice(45.67);
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结果:
(2)动态XML Element
有时候,Products元素下面并不只是加入product,可能动态加入各种商品.这次模拟的商品是糕点与饼干.
需要注意的是@XmlRootElement注解不能少.
Cake实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Cake")
public class Cake {
private Integer id;
private String name;
...... get/set 方法
}
Biscuit实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Biscuit")
public class Biscuit {
private Integer id;
private String name;
...... get/set 方法
}
Order的第三个字段是List,但是没有指定一个特定对象,用了Object代指所有,还有一个@XmlAnyElement是最重要的注解,用来标注所有的Element
Order4实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.*;
import java.util.List;
@XmlRootElement(name = "Order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order4 {
private Integer id;
private Double price;
@XmlElementWrapper(name = "Products")
@XmlAnyElement
private List<Object> product;
...... get/set 方法
}
生成XMl方法:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;
public class testOrderDemo5 {
public static void main(String[] args) throws JAXBException {
Cake cake = new Cake();
cake.setId(1);
cake.setName("Nobel");
Biscuit biscuit = new Biscuit();
biscuit.setId(2);
biscuit.setName("PB");
List<Object> list = Arrays.asList(cake,biscuit);
Order4 order = new Order4();
order.setId(1);
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结果:
(3)XML动态Attribute
动态Element对应的是Attribute,不过需要注意的是动态Attribute需要的是Map,而且其key的类型需要指定为QName,这个QName在复杂的XML生成时有很大用处.一般使用到的是其QName(name),它还有一个形式为QName(name,namespace),可以指定命名空间,在某些场景下有不可替代的作用.
Product实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
@XmlAttribute
private Integer id;
private String name;
...... get/set 方法
}
Order5实体类:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import java.util.Map;
@XmlRootElement(name = "Order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order5 {
@XmlAnyAttribute
private Map<QName, String> properties;
private Product product;
...... get/set方法
}
生成XMl方法:
package com.liantuo.contrast.util.jaxb;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.Map;
public class testOrderDemo6 {
public static void main(String[] args) throws JAXBException {
Product p = new Product();
p.setId(1);
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);
}
}
XML结果: