工具类的介绍
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));
}
}