package com.happy.Until.weixin; import org.apache.commons.lang.StringUtils; import javax.xml.bind.*; import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.namespace.QName; import java.io.StringReader; import java.io.StringWriter; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * 使用Jaxb2.0实现XML<->Java Object的Binder. * * 特别支持Root对象是List的情形. * * @author */ public class JaxbUtil { // 多线程安全的Context. private JAXBContext jaxbContext; /** * @param types * 所有需要序列化的Root对象的类型. */ public JaxbUtil(Class... types) { try { jaxbContext = JAXBContext.newInstance(types); } catch (JAXBException e) { throw new RuntimeException(e); } } /** * Java Object->Xml. */ public String toXml(Object root, String encoding) { try { StringWriter writer = new StringWriter(); createMarshaller(encoding).marshal(root, writer); return writer.toString(); } catch (JAXBException e) { throw new RuntimeException(e); } } /** * Java Object->Xml, 特别支持对Root Element是Collection的情形. */ @SuppressWarnings("unchecked") public String toXml(Collection root, String rootName, String encoding) { try { CollectionWrapper wrapper = new CollectionWrapper(); wrapper.collection = root; JAXBElement wrapperElement = new JAXBElement( new QName(rootName), CollectionWrapper.class, wrapper); StringWriter writer = new StringWriter(); createMarshaller(encoding).marshal(wrapperElement, writer); return writer.toString(); } catch (JAXBException e) { throw new RuntimeException(e); } } /** * Xml->Java Object. */ @SuppressWarnings("unchecked") public T fromXml(String xml) { try { StringReader reader = new StringReader(xml); return (T) createUnmarshaller().unmarshal(reader); } catch (JAXBException e) { throw new RuntimeException(e); } } /** * Xml->Java Object, 支持大小写敏感或不敏感. */ @SuppressWarnings("unchecked") public T fromXml(String xml, boolean caseSensitive) { try { String fromXml = xml; if (!caseSensitive) fromXml = xml.toLowerCase(); StringReader reader = new StringReader(fromXml); return (T) createUnmarshaller().unmarshal(reader); } catch (JAXBException e) { throw new RuntimeException(e); } } /** * 创建Marshaller, 设定encoding(可为Null). */ public Marshaller createMarshaller(String encoding) { try { Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); if (StringUtils.isNotBlank(encoding)) { marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); } return marshaller; } catch (JAXBException e) { throw new RuntimeException(e); } } /** * 创建UnMarshaller. */ public Unmarshaller createUnmarshaller() { try { return jaxbContext.createUnmarshaller(); } catch (JAXBException e) { throw new RuntimeException(e); } } /** * 封装Root Element 是 Collection的情况. */ public static class CollectionWrapper { @SuppressWarnings("unchecked") @XmlAnyElement protected Collection collection; } /** * 把map转换成xml格式 * @param params * @return * @throws Exception */ public static String getRequestXml(Map params) throws Exception{ StringBuffer sb = new StringBuffer(); sb.append(""); Set> es = params.entrySet(); Iterator> it = es.iterator(); while (it.hasNext()) { Entry entry = (Entry) it .next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) { sb.append("<" + k + ">" + ""); } else { sb.append("<" + k + ">" + v + ""); } } sb.append(""); return new String(sb.toString().toString().getBytes(), "utf-8"); } }