xml與實體互相轉換

我們在請求國家系統經常會遇到webservice 接口他們一般傳輸使用xml 所以使用xml就會遇到和實體接互相轉換以及實體與xml
不對應怎麼處理。接下來提供一種解決方案 他可以處理xml 和實體隨意轉換!

  • 建立實體(模擬發票實體)
package com.dairuijie.test.bean;

import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;

/**
 * 
 * @ClassName: InvoiceBean
 * @Description:TODO(這裏用一句話描述這個類的作用)
 * @author: drj
 * @date: 2019年8月11日 下午5:36:39
 * 
 * @Copyright: 2019
 *
 */
@XStreamAlias("invoice")
public class InvoiceBean {

	/**
	 * 發票id
	 */
	@XStreamAlias("invoiceId")
	private Long invoiceId;

	/**
	 * 發票號碼
	 */
	@XStreamAlias("invoiceNum")
	private String invoiceNum;

	/**
	 * 發票代碼
	 */
	@XStreamAlias("invoiceCode")
	private String invoiceCode;

	/**
	 * 商品名稱
	 */
	@XStreamImplicit(itemFieldName="invoiceDetail")
	private List<InvoiceDetail> invoiceDetail;

	public Long getInvoiceId() {
		return invoiceId;
	}

	public void setInvoiceId(Long invoiceId) {
		this.invoiceId = invoiceId;
	}

	public String getInvoiceNum() {
		return invoiceNum;
	}

	public void setInvoiceNum(String invoiceNum) {
		this.invoiceNum = invoiceNum;
	}

	public String getInvoiceCode() {
		return invoiceCode;
	}

	public void setInvoiceCode(String invoiceCode) {
		this.invoiceCode = invoiceCode;
	}

	public List<InvoiceDetail> getInvoiceDetail() {
		return invoiceDetail;
	}

	public void setInvoiceDetail(List<InvoiceDetail> invoiceDetail) {
		this.invoiceDetail = invoiceDetail;
	}

	@Override
	public String toString() {
		return "InvoiceBean [invoiceId=" + invoiceId + ", invoiceNum=" + invoiceNum + ", invoiceCode=" + invoiceCode
				+ ", invoiceDetail=" + invoiceDetail + "]";
	}

}
package com.dairuijie.test.bean;

import java.math.BigDecimal;

import com.thoughtworks.xstream.annotations.XStreamAlias;

/**
 * 
 * @ClassName:  InvoiceDetail   
 * @Description:TODO(這裏用一句話描述這個類的作用)   
 * @author: drj 
 * @date:   2019年8月11日 下午8:14:50   
 *     
 * @Copyright: 2019 
 *
 */
@XStreamAlias("invoiceDetail")
public class InvoiceDetail {

	/**
	 * 貨物名稱
	 */
	@XStreamAlias("goodsName")
	private String goodsName;
	
	/**
	 * 單位
	 */
	@XStreamAlias("unit")
	private String unit;
	
	/**
	 * 單價
	 */
	@XStreamAlias("price")
	private BigDecimal price;

	public String getGoodsName() {
		return goodsName;
	}

	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}

	public String getUnit() {
		return unit;
	}

	public void setUnit(String unit) {
		this.unit = unit;
	}

	public BigDecimal getPrice() {
		return price;
	}

	public void setPrice(BigDecimal price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "InvoiceDetail [goodsName=" + goodsName + ", unit=" + unit + ", price=" + price + "]";
	} 
	
	
}

  • XStreamConvertor xml工具類
package com.dairuijie.test.utils;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.springframework.oxm.xstream.XStreamMarshaller;

import com.dairuijie.test.bean.InvoiceBean;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.zl.vtax.base.BusinessException;
/**
 * 
 * @ClassName:  XStreamConvertor   
 * @Description:TODO(xml 工具類)   
 * @author: drj 
 * @date:   2019年8月11日 下午10:35:52   
 *   
 * @param <T>  
 * @Copyright: 2019 
 *
 */
public class XStreamConvertor<T> {
	private static XStreamConvertor<?> instance = null;//單例模式
	private static Map<String, XStreamMarshaller> xstreamCache = new ConcurrentHashMap<String, XStreamMarshaller>();
	private static final String XML_TAG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
	private static final String GBK = "UTF-8";
	static {
		instance = new XStreamConvertor<>();
	}

	public String toXml(T pojo) throws BusinessException {
		String clzName = pojo.getClass().getName();
		XStreamMarshaller xstreamMarshaller = xstreamCache.get(clzName);
		if (xstreamMarshaller == null) {
			xstreamMarshaller = new XStreamMarshaller();
			xstreamMarshaller.setEncoding(GBK);
			xstreamMarshaller.setStreamDriver(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
			xstreamCache.put(clzName, xstreamMarshaller);
		}
		XStream xStream = xstreamMarshaller.getXStream();
		XStream.setupDefaultSecurity(xStream);//防止出現 xStream:Security framework of XStream not initialized, XStream is probably vulnerable.
		xStream.allowTypes(new Class[]{InvoiceBean.class});//允許轉換對象
		xStream.processAnnotations(pojo.getClass());
		return XML_TAG + xStream.toXML(pojo).replaceAll("<tiripPackage>", "").replaceAll("&quot;", "\"");
	}

	@SuppressWarnings("unchecked")
	public T fromXml(Class<T> clz, String xml) {
		String clzName = clz.getName();
		XStreamMarshaller xstreamMarshaller = xstreamCache.get(clzName);
		if (xstreamMarshaller == null) {
			xstreamMarshaller = new XStreamMarshaller();
			xstreamMarshaller.setEncoding(GBK);
			xstreamMarshaller.setStreamDriver(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
			xstreamCache.put(clzName, xstreamMarshaller);
		}
		XStream xStream = xstreamMarshaller.getXStream();
		xStream.setClassLoader(clz.getClassLoader());
		xStream.processAnnotations(clz);
		return (T) xStream.fromXML(xml);
	}

	@SuppressWarnings("unchecked")
	public static XStreamConvertor<Object> getInstance() {
		return (XStreamConvertor<Object>) instance;
	}
}

  • 測試類
package com.dairuijie.test.utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.dairuijie.test.bean.InvoiceBean;
import com.dairuijie.test.bean.InvoiceDetail;

/**
 * 
 * @ClassName: XmlBeanUtils
 * @Description:TODO(這裏用一句話描述這個類的作用)
 * @author: drj
 * @date: 2019年8月11日 下午9:01:31
 * 
 * @Copyright: 2019
 *
 */
public class XmlBeanUtils {

	public static void main(String[] args) {
		List<InvoiceDetail> list = new ArrayList<InvoiceDetail>();
		InvoiceDetail detail = new InvoiceDetail();
		detail.setGoodsName("牛肉");
		detail.setPrice(new BigDecimal("99"));
		detail.setUnit("元");
		list.add(detail);
		InvoiceBean bean = new InvoiceBean();
		bean.setInvoiceCode("99999");
		bean.setInvoiceId(999L);
		bean.setInvoiceNum("99999");
		bean.setInvoiceDetail(list);
		@SuppressWarnings("rawtypes")
		XStreamConvertor xmlUtils = XStreamConvertor.getInstance();
		@SuppressWarnings("unchecked")
		String xmlstr = xmlUtils.toXml(bean);
		System.out.println("實體轉xml:" + xmlstr);
		@SuppressWarnings("unchecked")
		InvoiceBean invoiceBean = (InvoiceBean) xmlUtils.fromXml(InvoiceBean.class, xmlstr);
		System.out.println("xml轉實體: " + invoiceBean);
	}
}

  • 結果
實體轉xml:<?xml version="1.0" encoding="UTF-8"?><invoice>
  <invoiceId>999</invoiceId>
  <invoiceNum>99999</invoiceNum>
  <invoiceCode>99999</invoiceCode>
  <invoiceDetail>
    <goodsName>牛肉</goodsName>
    <unit>元</unit>
    <price>99</price>
  </invoiceDetail>
</invoice>
xml轉實體: InvoiceBean [invoiceId=999, invoiceNum=99999, invoiceCode=99999, invoiceDetail=[InvoiceDetail [goodsName=牛肉, unit=元, price=99]]]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章