【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));
    }
}
原文地址:https://www.cnblogs.com/flydkPocketMagic/p/7055279.html