工具類的介紹
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));
}
}