bean-xml互轉(使用javax.xml.bind包)


工具類的介紹

JAXB(Java API for XML Binding),提供了一個快速便捷的方式將Java對象與XML進行轉換。在JAX-WS(Java的WebService規范之一)中,JDK1.6 自帶的版本JAX-WS2.1,其底層支持就是JAXB

JAXB 可以實現Java對象與XML的相互轉換,在JAXB中,將一個Java對象轉換為XML的過程稱之為Marshal,將XML轉換為Java對象的過程稱之為UnMarshal。我們可以通過在 Java 類中標注注解的方式將一個Java對象綁定到一段XML,也就是說,在Java類中標注一些注解,這些注解定義了如何將這個類轉換為XML,怎么轉換,以及一段XML如何被解析成這個類所定義的對象;也可以使用JAXB的XJC工具,通過定義schema的方式實現Java對象與XML的綁定(這個下次研究)。

常用注解

  • @XmlRootElement:根節點
  • @XmlAttribute:該屬性作為xml的attribute
  • @XmlElement:該屬性作為xml的element,且可以增加屬性(name="NewElementName"),那么生成的xml串的elment的標簽是NewElementName
  • @XmlElementWrapper : 用於list元素的注解,避免生成和讀取時缺失list中節點內容,XmlElementWrapper用於父節點,XmlElement用於子節點

使用實例

  • @XmlRootElement@XmlAttribute使用,每個類都需要根節點,抬頭加XmlRootElement
    package com.orange.api.util;
    
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "Response")
    public class ResponseXml {
        private static final long serialVersionUID = 5594125247507960652L;
        private String code;
        private String description;
        private OrderResponseXml orderResponse;
    
        public String getCode() {
            return this.code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public String getDescription() {
            return this.description;
        }
        
        @XmlAttribute(name = "description")
        public void setDescription(String description) {
            this.description = description;
        }
    
    
        public OrderResponseXml getOrderResponse() {
            return this.orderResponse;
        }
    
        public void setOrderResponse(OrderResponseXml orderResponse) {
            this.orderResponse = orderResponse;
        }
    
        @Override
    	public String toString() {
    		return "ResponseXml [code=" + code + ", description=" + description
    				+ ", orderResponse=" + orderResponse + "]";
    	}
    }
  • @XmlElementWrapper@XmlElement使用,主要用於List類型
    package com.orange.api.util;
    
    import java.util.List;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "order")
    public class OrderXml {
        private static final long serialVersionUID = 7931221549662303872L;
        private String orderId;
        private String partnerId;
        private List<TicketOrderXml> ticketOrders;
    
        @XmlElement
        public String getOrderId() {
            return orderId;
        }
    
    
    
        public void setOrderId(String orderId) {
            this.orderId = orderId;
        }
    
    
        public String getPartnerId() {
            return partnerId;
        }
    
        
        public void setPartnerId(String partnerId) {
            this.partnerId = partnerId;
        }
    
        public List<TicketOrderXml> getTicketOrders() {
            return ticketOrders;
        }
    
        @XmlElementWrapper(name="ticketOrders")
        @XmlElement(name="ticketOrder")
        public void setTicketOrders(List<TicketOrderXml> ticketOrders) {
            this.ticketOrders = ticketOrders;
        }
    }
  • 其他類
   package com.orange.api.util;
    
   import javax.xml.bind.annotation.XmlRootElement;
    
   @XmlRootElement(name = "orderResponse")
   public class OrderResponseXml {
        private OrderXml order;
    
        public OrderXml getOrder() {
            return this.order;
        }
    
        public void setOrder(OrderXml order) {
            this.order = order;
        }
    }
   package com.orange.api.util;
    
   import javax.xml.bind.annotation.XmlRootElement;
    
   @XmlRootElement(name = "ticketOrder")
   public class TicketOrderXml {
        private String totalPrice;
        private String total_price;
        private String goodsName;
        public String getTotalPrice() {
            return totalPrice;
        }
        public void setTotalPrice(String totalPrice) {
            this.totalPrice = totalPrice;
        }
        public String getGoodsName() {
            return goodsName;
        }
        public void setGoodsName(String goodsName) {
            this.goodsName = goodsName;
        }
        public String getTotal_price() {
    		return total_price;
    	}
    	public void setTotal_price(String total_price) {
    		this.total_price = total_price;
    	}
   }
  • 工具類,Bean、XML互轉
    package com.orange.api.util;
    
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.io.StringWriter;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    
    /**
     * bean<->xml互轉工具類
     * @author tanwg
     * @date 2017年8月30日
     */
    public class XmlHelper {
        public static <T> T toObj(Class<T> clazz, String xml) {
            try {
                JAXBContext context = JAXBContext
                        .newInstance(new Class[] { clazz });
                InputStream buf = new ByteArrayInputStream(xml.getBytes("UTF-8"));
                return (T) context.createUnmarshaller().unmarshal(buf);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static <T> String toXml(T obj) {
            try {
                StringWriter write = new StringWriter();
                JAXBContext context = JAXBContext.newInstance(new Class[] { obj
                        .getClass() });
                context.createMarshaller().marshal(obj, write);
                return write.getBuffer().toString();
            } catch (JAXBException e) {
                e.printStackTrace();
            }
            return "";
        }
    }
  • 測試類
    package com.orange.api.util;
    /**
     * 測試
     * @author tanwg
     * @date 2017年8月30日
     */
    public class XmlTest {
        public static void main(String[] args) {
            StringBuilder sb = new StringBuilder();
            sb.append("<Response sign='1234567'>");
            sb.append("<code>1000</code>");
            sb.append("<description>測試</description>");
            sb.append("<description>12345</description>");
            sb.append("<eee>12345</eee>");
            sb.append("<orderResponse>");
            sb.append("<order>");
            sb.append("<orderId>330182198804273139</orderId>");
            sb.append("<partnerId>12345</partnerId>");
            sb.append("<abc>12345</abc>");
    
            sb.append("<ticketOrders>");
    
            for (int i = 0; i <= 1; i++) {
                sb.append("<ticketOrder>");
                sb.append("<total_price>2</total_price>");
                sb.append("<goodsName>測試票</goodsName>");
                sb.append("</ticketOrder>");
            }
            sb.append("</ticketOrders>");
            sb.append("</order>");
            sb.append("</orderResponse>");
            sb.append("</Response>");
            System.out.println("原始字符串:" + sb.toString());
            ResponseXml respone = (ResponseXml) XmlHelper.toObj(ResponseXml.class, sb.toString());
            System.out.println("獲取節點值:" + respone.getOrderResponse().getOrder().getOrderId());
            System.out.println("轉換字符串:" + XmlHelper.toXml(respone));
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM