zoukankan      html  css  js  c++  java
  • 【XML】使用javax.xml.bind包实现bean-xml互转

    1.定义basexml,放置response属性:

    使用注解

    @XmlAttribute
    package com.zlg.test.xml;
    
    import javax.xml.bind.annotation.XmlAttribute;
    
    public class BaseXml {
        public static final String ERROR = "1";
        public static final String SUCCESS = "0";
        private String msgId;
        private String msg;
        private String sign;
    
        @XmlAttribute
        public String getMsgId() {
            return this.msgId;
        }
    
        public void setMsgId(String msgId) {
            this.msgId = msgId;
        }
    
        @XmlAttribute
        public String getMsg() {
            return this.msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        @XmlAttribute
        public String getSign() {
            return this.sign;
        }
    
        public void setSign(String sign) {
            this.sign = sign;
        }
    }

    2.定义responsexml

    使用注解,并命别名Response,以此我们的类可以根据业务需要命名,对外提供统一的出口Response

    @XmlRootElement(name = "Response")
    package com.zlg.test.xml;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "Response")
    public class ResponseXml extends BaseXml {
        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;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
    
        public OrderResponseXml getOrderResponse() {
            return this.orderResponse;
        }
    
        public void setOrderResponse(OrderResponseXml orderResponse) {
            this.orderResponse = orderResponse;
        }
    }

    3.其他层级xml定义

    OrderResponseXml

    package com.zlg.test.xml;
    
    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;
        }
    }

    OrderXml

    对于list元素需要添加如下注解,避免生成和读取时缺失list中节点内容

    @XmlElementWrapper(name="ticketOrders")
    @XmlElement(name="ticketOrder")
    package com.zlg.test.xml;
    
    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;
        }
    }

    TicketOrderXml

    package com.zlg.test.xml;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "ticketOrder")
    public class TicketOrderXml {
        private String totalPrice;
        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;
        }
    }

    备注:所有类,均需要使用注解@XmlRootElement(name = "ticketOrder") 可以命别名

    4.转化工具类

    package com.zlg.test.xml;
    
    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 zlg
     * @date 2017年6月20日
     * modify history
     */
    public class XmlHelper {
        public static <T extends BaseXml> 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 extends BaseXml> 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 "";
        }
    }

    5.测试类

    package com.zlg.test.xml;
    
    /**
     * 测试
     * @author zlg
     * @date 2017年6月20日
     * modify history
     */
    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("<orderResponse>");
            sb.append("<order>");
            sb.append("<orderId>330182198804273139</orderId>");
            sb.append("<partnerId>12345</partnerId>");
    
            sb.append("<ticketOrders>");
    
            for (int i = 0; i <= 1; i++) {
                sb.append("<ticketOrder>");
                sb.append("<totalPrice>100</totalPrice>");
                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("获取属性:" + respone.getSign());
            System.out.println("转换字符串:" + XmlHelper.toXml(respone));
        }
    }
  • 相关阅读:
    js以字符串方式创建DOM(原生js,jquery,extjs)
    gallery3
    检测标准类型和内置对象类型
    js数据类型和类型检测
    gallery2
    gallery
    如何使用Git上传项目代码到github
    sublime EMMET
    模糊搜索
    导出表格
  • 原文地址:https://www.cnblogs.com/flydkPocketMagic/p/7055279.html
Copyright © 2011-2022 走看看