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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值