JAXB(Java Architecture for XML Binding簡稱JAXB)容許Java開發人員將Java類映射爲XML表示方式。JAXB提供兩種主要特性:將一個Java對象序列化爲XML,以及反向操做,將XML解析成Java對象。換句話說,JAXB容許以XML格式存儲和讀取數據,而不須要程序的類結構實現特定的讀取XML和保存XML的代碼。java
@XmlTypeapp
@XmlElementide
@XmlRootElement測試
@XmlAttributethis
@XmlAccessorTypespa
@XmlAccessorOrdercode
@XmlTransientorm
@XmlJavaTypeAdapterxml
@XmlType用在class類的註解,常與@XmlRootElement,@XmlAccessorType一塊兒使用。它有三個屬性:name、propOrder、namespace,常用的只有前兩個屬性。如:對象
@XmlType(name = "basicStruct", propOrder = {
"intValue",
"stringArray",
"stringValue"
)
在使用@XmlType的propOrder 屬性時,必須列出JavaBean對象中的全部屬性,不然會報錯。
@XmlElement將java對象的屬性映射爲xml的節點,在使用@XmlElement時,可經過name屬性改變java對象屬性在xml中顯示的名稱。如:
@XmlElement(name="Address")
private String yourAddress;
@XmlRootElement用於類級別的註解,對應xml的跟元素,常與 @XmlType 和 @XmlAccessorType一塊兒使用。如:
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Address {}
@XmlAttribute用於把java對象的屬性映射爲xml的屬性,並可經過name屬性爲生成的xml屬性指定別名。如:
@XmlAttribute(name="Country")
private String state;
@XmlAccessorType用於指定由java對象生成xml文件時對java對象屬性的訪問方式。常與@XmlRootElement、@XmlType一塊兒使用。它的屬性值是XmlAccessType的4個枚舉值,分別爲:
XmlAccessType.FIELD:java對象中的全部成員變量
XmlAccessType.PROPERTY:java對象中全部經過getter/setter方式訪問的成員變量
XmlAccessType.PUBLIC_MEMBER:java對象中全部的public訪問權限的成員變量和經過getter/setter方式訪問的成員變量
XmlAccessType.NONE:java對象的全部屬性都不映射爲xml的元素
注意:@XmlAccessorType的默認訪問級別是XmlAccessType.PUBLIC_MEMBER,所以,若是java對象中的private成員變量設置了public權限的getter/setter方法,就不要在private變量上使用@XmlElement和@XmlAttribute註解,不然在由java對象生成xml時會報同一個屬性在java類裏存在兩次的錯誤。同理,若是@XmlAccessorType的訪問權限爲XmlAccessType.NONE,若是在java的成員變量上使用了@XmlElement或@XmlAttribute註解,這些成員變量依然能夠映射到xml文件。
@XmlAccessorOrder用於對java對象生成的xml元素進行排序。它有兩個屬性值:
AccessorOrder.ALPHABETICAL:對生成的xml元素按字母書序排序
XmlAccessOrder.UNDEFINED:不排序
@XmlTransient用於標示在由java對象映射xml時,忽略此屬性。即,在生成的xml文件中不出現此元素。
@XmlJavaTypeAdapter經常使用在轉換比較複雜的對象時,如map類型或者格式化日期等。使用此註解時,須要本身寫一個adapter類繼承XmlAdapter抽象類,並實現裏面的方法。
@XmlJavaTypeAdapter(value=xxx.class),value爲本身定義的adapter類
XmlAdapter以下:
public abstract class XmlAdapter<ValueType,BoundType> { // Do-nothing constructor for the derived classes. protected XmlAdapter() {} // Convert a value type to a bound type. public abstract BoundType unmarshal(ValueType v); // Convert a bound type to a value type. public abstract ValueType marshal(BoundType v); }
Shop.java
package jaxb2; import javax.xml.bind.annotation.*; import java.util.Set; @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "shop", propOrder = {"name", "number", "describer", "address", "orders"}) @XmlRootElement(name = "CHMart") public class Shop { @XmlAttribute private String name; @XmlElement private String number; @XmlElement private String describer; @XmlElementWrapper(name = "orders") @XmlElement(name = "order") private Set<Order> orders; @XmlElement private Address address; public Shop() { } public Shop(String name, String number, String describer, Address address) { this.name = name; this.number = number; this.describer = describer; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getDescriber() { return describer; } public void setDescriber(String describer) { this.describer = describer; } public Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
Order.java
package jaxb2; import java.math.BigDecimal; import java.util.Date; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlType(name = "order", propOrder = {"shopName", "orderNumber", "price", "amount", "purDate", "customer"}) @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement public class Order { // @XmlElement private String shopName; @XmlAttribute private String orderNumber; // @XmlElement @XmlJavaTypeAdapter(value = DateAdapter.class) private Date purDate; // @XmlElement private BigDecimal price; // @XmlElement private int amount; // @XmlElement private Customer customer; public Order() { } public Order(String shopName, String orderNumber, Date purDate, BigDecimal price, int amount) { this.shopName = shopName; this.orderNumber = orderNumber; this.purDate = purDate; this.price = price; this.amount = amount; } public String getShopName() { return shopName; } public void setShopName(String shopName) { this.shopName = shopName; } public String getOrderNumber() { return orderNumber; } public void setOrderNumber(String orderNumber) { this.orderNumber = orderNumber; } public Date getPurDate() { return purDate; } public void setPurDate(Date purDate) { this.purDate = purDate; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } }
Customer.java
package jaxb2; import java.util.Set; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @XmlType @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement public class Customer { @XmlAttribute private String name; private String gender; private String phoneNo; private Address address; private Set<Order> orders; public Customer() { } public Customer(String name, String gender, String phoneNo, Address address) { this.name = name; this.gender = gender; this.phoneNo = phoneNo; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getPhoneNo() { return phoneNo; } public void setPhoneNo(String phoneNo) { this.phoneNo = phoneNo; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } }
Address.java
package jaxb2; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessOrder; import javax.xml.bind.annotation.XmlAccessorOrder; @XmlType(propOrder = {"state", "province", "city", "street", "zip"}) @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement public class Address { @XmlAttribute private String state; @XmlElement private String province; @XmlElement private String city; @XmlElement private String street; @XmlElement private String zip; public Address() { super(); } public Address(String state, String province, String city, String street, String zip) { super(); this.state = state; this.province = province; this.city = city; this.street = street; this.zip = zip; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } }
DateAdapter.java
package jaxb2; import java.util.Date; import java.text.SimpleDateFormat; import javax.xml.bind.annotation.adapters.XmlAdapter; public class DateAdapter extends XmlAdapter<String, Date> { private String pattern = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat fmt = new SimpleDateFormat(pattern); @Override public Date unmarshal(String dateStr) throws Exception { return fmt.parse(dateStr); } @Override public String marshal(Date date) throws Exception { return fmt.format(date); } }
最後作一個測試:
package jaxb2; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.math.BigDecimal; import java.util.Date; import java.util.HashSet; import java.util.Set; /** * Created with IntelliJ IDEA. * User: ASUS * Date: 14-7-2 * Time: 下午6:10 * To change this template use File | Settings | File Templates. */ public class Test { public static void main(String[] args) throws JAXBException, IOException { Set<Order> orders = new HashSet<Order>(); Address address1 = new Address("China", "ShangHai", "ShangHai", "Huang", "200000"); Customer customer1 = new Customer("Jim", "male", "13699990000", address1); Order order1 = new Order("Mart", "LH59900", new Date(), new BigDecimal(60), 1); order1.setCustomer(customer1); Address address2 = new Address("China", "JiangSu", "NanJing", "ZhongYangLu", "210000"); Customer customer2 = new Customer("David", "male", "13699991000", address2); Order order2 = new Order("Mart", "LH59800", new Date(), new BigDecimal(80), 1); order2.setCustomer(customer2); orders.add(order1); orders.add(order2); Address address3 = new Address("China", "ZheJiang", "HangZhou", "XiHuRoad", "310000"); Shop shop = new Shop("CHMart", "100000", "EveryThing", address3); shop.setOrders(orders); FileWriter writer = null; JAXBContext context = JAXBContext.newInstance(Shop.class); try { Marshaller marshal = context.createMarshaller(); marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshal.marshal(shop, System.out); writer = new FileWriter("shop.xml"); marshal.marshal(shop, writer); } catch (Exception e) { e.printStackTrace(); } Unmarshaller unmarshal = context.createUnmarshaller(); FileReader reader = new FileReader("shop.xml"); Shop shop1 = (Shop) unmarshal.unmarshal(reader); Set<Order> orders1 = shop1.getOrders(); for (Order order : orders1) { System.out.println("***************************"); System.out.println(order.getOrderNumber()); System.out.println(order.getCustomer().getName()); System.out.println("***************************"); } } }
以上是以一個簡單的商店訂單模型做爲示例。
====END====