zoukankan      html  css  js  c++  java
  • JAXB--学习2

    一.Jaxb处理java对象和xml之间转换常用的annotation有:

    1. @XmlType
    2. @XmlElement
    3. @XmlRootElement
    4. @XmlAttribute
    5. @XmlAccessorType
    6. @XmlAccessorOrder
    7. @XmlTransient
    8. @XmlJavaTypeAdapter

     二.常用annotation使用说明

    1. @XmlType

      @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

    @XmlType(name = "basicStruct", propOrder = {
        "intValue",
        "stringArray",
        "stringValue"
    )
    在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

      2.@XmlElement

      @XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:

      @XmlElement(name="Address")  
      private String yourAddress;

      3.@XmlRootElement

      @XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:

      @XmlType
      @XmlAccessorType(XmlAccessType.FIELD)
      @XmlRootElement
      public class Address {}

      4.@XmlAttribute

      @XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:
      @XmlAttribute(name="Country")
      private String state;

      5.@XmlAccessorType

      @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文件。

      6.@XmlAccessorOrder

      @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:

      AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序

      XmlAccessOrder.UNDEFINED:不排序

      7.@XmlTransient

      @XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。

      8.@XmlJavaTypeAdapter

      @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);
    }

     三.示例

      1.Shop.java

    [java] view plaincopy
     
    1. package jaxb.shop;  
    2.   
    3. import java.util.Set;  
    4.   
    5. import javax.xml.bind.annotation.XmlAccessOrder;  
    6. import javax.xml.bind.annotation.XmlAccessType;  
    7. import javax.xml.bind.annotation.XmlAccessorType;  
    8. import javax.xml.bind.annotation.XmlAttribute;  
    9. import javax.xml.bind.annotation.XmlElement;  
    10. import javax.xml.bind.annotation.XmlRootElement;  
    11. import javax.xml.bind.annotation.XmlType;  
    12. import javax.xml.bind.annotation.XmlElementWrapper;  
    13. import javax.xml.bind.annotation.XmlAccessorOrder;  
    14.   
    15. @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)  
    16. @XmlAccessorType(XmlAccessType.FIELD)  
    17. @XmlType(name = "shop", propOrder = { "name", "number", "describer", "address","orders" })  
    [java] view plaincopy
     
    1. @XmlRootElement(name = "CHMart")  
    2. public class Shop {  
    3.   
    4.     @XmlAttribute  
    5.     private String name;  
    6.   
    7.     // @XmlElement  
    8.     private String number;  
    9.   
    10.     @XmlElement  
    11.     private String describer;  
    12.   
    13.     @XmlElementWrapper(name = "orders")  
    14.     @XmlElement(name = "order")  
    15.     private Set<Order> orders;  
    16.   
    17.     @XmlElement  
    18.     private Address address;  
    19.   
    20.     public Shop() {  
    21.     }  
    22.   
    23.     public Shop(String name, String number, String describer, Address address) {  
    24.         this.name = name;  
    25.         this.number = number;  
    26.         this.describer = describer;  
    27.         this.address = address;  
    28.     }  
    29.   
    30.     getter/setter略  
    [java] view plaincopy
     
    1. //同时使用了@XmlType(propOrder={})和@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL),但是生成的xml只按照propOrder定义的顺序生成元素  

      2.Order.java

    [java] view plaincopy
     
    1. package jaxb.shop;  
    2.   
    3. import java.math.BigDecimal;  
    4. import java.util.Date;  
    5.   
    6. import javax.xml.bind.annotation.XmlAccessType;  
    7. import javax.xml.bind.annotation.XmlAccessorType;  
    8. import javax.xml.bind.annotation.XmlAttribute;  
    9. import javax.xml.bind.annotation.XmlRootElement;  
    10. import javax.xml.bind.annotation.XmlType;  
    11. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;  
    12.   
    13. @XmlType(name="order",propOrder={"shopName","orderNumber","price","amount","purDate","customer"})  
    14. @XmlAccessorType(XmlAccessType.FIELD)  
    15. @XmlRootElement  
    16. public class Order {  
    17.   
    18. //  @XmlElement    
    19.     private String shopName;  
    20.   
    21.     @XmlAttribute  
    22.     private String orderNumber;  
    23.   
    24. //  @XmlElement  
    25.     @XmlJavaTypeAdapter(value=DateAdapter.class)  
    26.     private Date purDate;  
    27.   
    28. //  @XmlElement  
    29.     private BigDecimal price;  
    30.   
    31. //  @XmlElement  
    32.     private int amount;  
    33.   
    34. //  @XmlElement  
    35.     private Customer customer;  
    36.   
    37.     public Order() {  
    38.     }  
    39.   
    40.     public Order(String shopName, String orderNumber, Date purDate,  
    41.             BigDecimal price, int amount) {  
    42.         this.shopName = shopName;  
    43.         this.orderNumber = orderNumber;  
    44.         this.purDate = purDate;  
    45.         this.price = price;  
    46.         this.amount = amount;  
    47.     }  
    [java] view plaincopy
     
    1. getter/setter略  
    [java] view plaincopy
     
    1. //@XmlAccessorType(XmlAccessType.FIELD),所以此处注释掉了@XmlElement,xml中依然会生成这些元素  

      3.Customer.java

    [java] view plaincopy
     
    1. package jaxb.shop;  
    2.   
    3. import java.util.Set;  
    4. import javax.xml.bind.annotation.XmlType;  
    5. import javax.xml.bind.annotation.XmlAttribute;  
    6. import javax.xml.bind.annotation.XmlElement;  
    7. import javax.xml.bind.annotation.XmlRootElement;  
    8. import javax.xml.bind.annotation.XmlAccessType;  
    9. import javax.xml.bind.annotation.XmlAccessorType;  
    10.   
    11. @XmlType  
    12. @XmlAccessorType(XmlAccessType.FIELD)  
    13. @XmlRootElement  
    14. public class Customer {  
    15.   
    16.     @XmlAttribute  
    17.     private String name;  
    18.   
    19.     private String gender;  
    20.   
    21.     private String phoneNo;  
    22.   
    23.     private Address address;  
    24.   
    25.     private Set<Order> orders;  
    26.   
    27.     public Customer() {  
    28.     }  
    29.   
    30.     public Customer(String name, String gender, String phoneNo, Address address) {  
    31.         this.name = name;  
    32.         this.gender = gender;  
    33.         this.phoneNo = phoneNo;  
    34.         this.address = address;  
    35.     }  
    [java] view plaincopy
     
    1. getter/setter略  

      4.Address.java

    [java] view plaincopy
     
    1. package jaxb.shop;  
    2.   
    3. import javax.xml.bind.annotation.XmlAttribute;  
    4. import javax.xml.bind.annotation.XmlType;  
    5. import javax.xml.bind.annotation.XmlElement;  
    6. import javax.xml.bind.annotation.XmlRootElement;  
    7. import javax.xml.bind.annotation.XmlAccessType;  
    8. import javax.xml.bind.annotation.XmlAccessorType;  
    9. import javax.xml.bind.annotation.XmlAccessOrder;  
    10. import javax.xml.bind.annotation.XmlAccessorOrder;  
    11.   
    12. @XmlType(propOrder={"state","province","city","street","zip"})  
    13. @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)  
    14. @XmlAccessorType(XmlAccessType.NONE)  
    15. @XmlRootElement  
    16. public class Address {  
    17.   
    18.     @XmlAttribute   
    19.     private String state;  
    20.       
    21.     @XmlElement  
    22.     private String province;  
    23.       
    24.     @XmlElement  
    25.     private String city;  
    26.   
    27.     @XmlElement  
    28.     private String street;  
    29.       
    30.     @XmlElement  
    31.     private String zip;  
    32.   
    33.     public Address() {  
    34.         super();  
    35.     }  
    36.   
    37.     public Address(String state, String province, String city, String street,  
    38.             String zip) {  
    39.         super();  
    40.         this.state = state;  
    41.         this.province = province;  
    42.         this.city = city;  
    43.         this.street = street;  
    44.         this.zip = zip;  
    45.     }  
    [java] view plaincopy
     
    1. getter/setter略  
    [java] view plaincopy
     
    1. //注意:虽然@XmlAccessorType为XmlAccessType.NONE,但是在java类的私有属性上加了@XmlAttribute和@XmlElement注解后,这些私有成员会映射生成xml的元素  

      5.DateAdapter.java

    [java] view plaincopy
     
    1. package jaxb.shop;  
    2.   
    3. import java.util.Date;  
    4. import java.text.SimpleDateFormat;  
    5.   
    6. import javax.xml.bind.annotation.adapters.XmlAdapter;  
    7.   
    8. public class DateAdapter extends XmlAdapter<String, Date> {  
    9.   
    10.     private String pattern = "yyyy-MM-dd HH:mm:ss";  
    11.     SimpleDateFormat fmt = new SimpleDateFormat(pattern);  
    12.       
    13.     @Override  
    14.     public Date unmarshal(String dateStr) throws Exception {  
    15.           
    16.         return fmt.parse(dateStr);  
    17.     }  
    18.   
    19.     @Override  
    20.     public String marshal(Date date) throws Exception {  
    21.           
    22.         return fmt.format(date);  
    23.     }  
    24.   
    25. }  
    [java] view plaincopy
     
    1. //用于格式化日期在xml中的显示格式,并且由xml unmarshal为java对象时,将字符串解析为Date对象  

      6.ShopTest.java

    [java] view plaincopy
     
    1. package jaxb.shop;  
    2.   
    3. import java.io.FileReader;  
    4. import java.io.FileWriter;  
    5. import java.io.IOException;  
    6. import java.math.BigDecimal;  
    7. import java.util.Date;  
    8. import java.util.HashSet;  
    9. import java.util.Set;  
    10.   
    11. import javax.xml.bind.JAXBContext;  
    12. import javax.xml.bind.JAXBException;  
    13. import javax.xml.bind.Marshaller;  
    14. import javax.xml.bind.Unmarshaller;  
    15.   
    16. public class ShopTest {  
    17.   
    18.     public static void main(String[] args) throws JAXBException, IOException{  
    19.         Set<Order> orders = new HashSet<Order>();  
    20.           
    21.         Address address1 = new Address("China", "ShangHai", "ShangHai", "Huang", "200000");  
    22.         Customer customer1 = new Customer("Jim", "male", "13699990000", address1);  
    23.         Order order1 = new Order("Mart", "LH59900", new Date(), new BigDecimal(60), 1);  
    24.         order1.setCustomer(customer1);  
    25.           
    26.         Address address2 = new Address("China", "JiangSu", "NanJing", "ZhongYangLu", "210000");  
    27.         Customer customer2 = new Customer("David", "male", "13699991000", address2);  
    28.         Order order2 = new Order("Mart", "LH59800", new Date(), new BigDecimal(80), 1);  
    29.         order2.setCustomer(customer2);  
    30.           
    31.         orders.add(order1);  
    32.         orders.add(order2);  
    33.           
    34.         Address address3 = new Address("China", "ZheJiang", "HangZhou", "XiHuRoad", "310000");  
    35.         Shop shop = new Shop("CHMart", "100000", "EveryThing",address3);  
    36.         shop.setOrder(orders);  
    37.           
    38.           
    39.         FileWriter writer = null;  
    40.         JAXBContext context = JAXBContext.newInstance(Shop.class);  
    41.         try {  
    42.             Marshaller marshal = context.createMarshaller();  
    43.             marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
    44.             marshal.marshal(shop, System.out);  
    45.               
    46.             writer = new FileWriter("shop.xml");  
    47.             marshal.marshal(shop, writer);  
    48.         } catch (Exception e) {  
    49.             e.printStackTrace();  
    50.         }  
    51.           
    52.         Unmarshaller unmarshal = context.createUnmarshaller();  
    53.         FileReader reader = new FileReader("shop.xml") ;  
    54.         Shop shop1 = (Shop)unmarshal.unmarshal(reader);  
    55.           
    56.         Set<Order> orders1 = shop1.getOrder();  
    57.         for(Order order : orders1){  
    58.             System.out.println("***************************");  
    59.             System.out.println(order.getOrderNumber());  
    60.             System.out.println(order.getCustomer().getName());  
    61.             System.out.println("***************************");  
    62.         }  
    63.     }  
    64. }  

      7.生成的xml文件

    [java] view plaincopy
     
    1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
    2. <CHMart name="CHMart">  
    3.     <number>100000</number>  
    4.     <describer>EveryThing</describer>  
    5.     <address state="China">  
    6.         <province>ZheJiang</province>  
    7.         <city>HangZhou</city>  
    8.         <street>XiHuRoad</street>  
    9.         <zip>310000</zip>  
    10.     </address>  
    11.     <orders>  
    12.         <order orderNumber="LH59800">  
    13.             <shopName>Mart</shopName>  
    14.             <price>80</price>  
    15.             <amount>1</amount>  
    16.             <purDate>2012-03-25 12:57:23</purDate>  
    17.             <customer name="David">  
    18.                 <gender>male</gender>  
    19.                 <phoneNo>13699991000</phoneNo>  
    20.                 <address state="China">  
    21.                     <province>JiangSu</province>  
    22.                     <city>NanJing</city>  
    23.                     <street>ZhongYangLu</street>  
    24.                     <zip>210000</zip>  
    25.                 </address>  
    26.             </customer>  
    27.         </order>  
    28.         <order orderNumber="LH59900">  
    29.             <shopName>Mart</shopName>  
    30.             <price>60</price>  
    31.             <amount>1</amount>  
    32.             <purDate>2012-03-25 12:57:23</purDate>  
    33.             <customer name="Jim">  
    34.                 <gender>male</gender>  
    35.                 <phoneNo>13699990000</phoneNo>  
    36.                 <address state="China">  
    37.                     <province>ShangHai</province>  
    38.                     <city>ShangHai</city>  
    39.                     <street>Huang</street>  
    40.                     <zip>200000</zip>  
    41.                 </address>  
    42.             </customer>  
    43.         </order>  
    44.     </orders>  
    45. </CHMart>  

      以上是以一个简单的商店订单模型作为示例。

  • 相关阅读:
    前端思想实现:面向UI编程_____前端框架设计开发
    使用单体模式设计原生js插件
    QQ空间首页背景图片淡出解析与不足完善
    网页字体设置
    Asp.net MVC Session过期异常的处理
    日本设计的七个原则
    断开所有远程连接(sql server)
    Ubuntu1404+Django1.9+Apache2.4部署配置2配置文件设置
    Linux系统查找文件find命令使用(不断更新)
    ubuntu1404下Apache2.4错误日志error.log路径位置
  • 原文地址:https://www.cnblogs.com/huangcongcong/p/4792744.html
Copyright © 2011-2022 走看看