xml and entity conversion

We often encounter webservice interfaces in the requesting country system. They generally use xml for transmission. Therefore, when using xml, it will encounter conversion between entities and
how to deal with the inconsistency between entities and xml . Next, provide a solution that can handle xml and entity conversion at will!

  • Create entity (simulate invoice entity)
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 tool class
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;
	}
}

  • Test class
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);
	}
}

  • result
实体转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]]]

Guess you like

Origin blog.csdn.net/qq_29897369/article/details/99242782