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 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 getTicketOrders() {
            return ticketOrders;
        }
    
        @XmlElementWrapper(name="ticketOrders")
        @XmlElement(name="ticketOrder")
        public void setTicketOrders(List 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 toObj(Class 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  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("");
            sb.append("1000");
            sb.append("测试");
            sb.append("12345");
            sb.append("12345");
            sb.append("");
            sb.append("");
            sb.append("330182198804273139");
            sb.append("12345");
            sb.append("12345");
    
            sb.append("");
    
            for (int i = 0; i <= 1; i++) {
                sb.append("");
                sb.append("2");
                sb.append("测试票");
                sb.append("");
            }
            sb.append("");
            sb.append("");
            sb.append("");
            sb.append("");
            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));
        }
    }

转载于:https://www.cnblogs.com/Eric-Hello/p/7452913.html

你可能感兴趣的:(bean-xml互转(使用javax.xml.bind包))