All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liuchink.hcutils.xml.HcXmlUtils Maven / Gradle / Ivy

The newest version!
package com.liuchink.hcutils.xml;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.naming.NoNameCoder;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.thoughtworks.xstream.mapper.MapperWrapper;
import com.thoughtworks.xstream.security.AnyTypePermission;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

/**
 * xml工具类
 *
 * @author liugang
 * @since 2019/7/11 15:36
 */
public class HcXmlUtils {
	private HcXmlUtils() {

	}

	/**
	 * Xml转Map
	 *
	 * @param xml
	 *            xml
	 * @return 转换后的map
	 * @throws ParserConfigurationException
	 *             ParserConfigurationException
	 * @throws IOException
	 *             IOException
	 * @throws SAXException
	 *             SAXException
	 * @author liugang
	 * @since 2017-09-01 16:56
	 */

	public static Map simpleXmlToMap(String xml)
			throws ParserConfigurationException, IOException, SAXException {
		Map data = new TreeMap<>();
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
				.newInstance();
		DocumentBuilder documentBuilder = documentBuilderFactory
				.newDocumentBuilder();
		InputStream stream = new ByteArrayInputStream(
				xml.getBytes(StandardCharsets.UTF_8));
		org.w3c.dom.Document doc = documentBuilder.parse(stream);
		doc.getDocumentElement().normalize();
		NodeList nodeList = doc.getDocumentElement().getChildNodes();
		for (int idx = 0; idx < nodeList.getLength(); ++idx) {
			Node node = nodeList.item(idx);
			if (node.getNodeType() == Node.ELEMENT_NODE) {
				org.w3c.dom.Element element = (org.w3c.dom.Element) node;
				data.put(element.getNodeName(), element.getTextContent());
			}
		}
		stream.close();
		return data;
	}

	/**
	 * Xml转Map
	 *
	 * @param xml
	 *            xml
	 * @return 转换后的map
	 * @throws DocumentException
	 *             DocumentException
	 * @throws IOException
	 *             IOException
	 * @author liugang
	 * @since 2017-09-01 16:56
	 */

	public static Map simpleXmlToMap(InputStream xml)
			throws IOException, DocumentException {
		Map params = new TreeMap<>();
		BufferedReader reader = new BufferedReader(new InputStreamReader(xml));
		StringBuilder sb = new StringBuilder();
		String line;
		while ((line = reader.readLine()) != null) {
			sb.append(line);
		}
		if (StringUtils.isNotBlank(sb.toString())) {
			Document doc = DocumentHelper.parseText(sb.toString());
			Element root = doc.getRootElement();
			for (Iterator iterator = root.elementIterator(); iterator
					.hasNext();) {
				Element e = (Element) iterator.next();
				params.put(e.getName(), e.getText());
			}
		}
		return params;
	}

	/**
	 * Map转换Xml
	 *
	 * @param map
	 *            map
	 * @return java.lang.String
	 * @author liugang
	 * @since 2017-09-07 9:34
	 */

	public static String simpleMapToXml(Map map) {
		StringBuilder builder = new StringBuilder();
		builder.append("");
		for (Map.Entry entry : map.entrySet()) {
			if (StringUtils.isNotBlank(entry.getValue())) {
				builder.append("<").append(entry.getKey()).append(">")
						.append("").append("");
			}
		}
		builder.append("");
		return builder.toString();
	}

	/**
	 * 对象转xml
	 *
	 * @param toXmlBean
	 *            toXmlBean
	 * @param father
	 *            father
	 * @return java.lang.String
	 * @author liugang
	 * @since 2019/9/9 14:52
	 */
	public static String beanToXml(String father, Object toXmlBean) {
		XStream xStream = new XStream(new XppDriver(new NoNameCoder()) {
			@Override
			public HierarchicalStreamWriter createWriter(Writer out) {
				return new PrettyPrintWriter(out) {
					boolean cdata = true;

					@Override
					public void startNode(String name, Class clazz) {
						super.startNode(name, clazz);
					}

					@Override
					public String encodeNode(String name) {
						return name;
					}

					@Override
					protected void writeText(QuickWriter writer, String text) {
						if (cdata) {
							writer.write("");
						} else {
							writer.write(text);
						}
					}
				};
			}
		});
		// xStream.processAnnotations(new Class[] { toXmlBean.getClass() });
		xStream.autodetectAnnotations(true);
		if (StringUtils.isNotBlank(father)) {
			xStream.alias(father, toXmlBean.getClass());
		}
		return xStream.toXML(toXmlBean);
	}

	/**
	 * 对象转xml
	 *
	 * @param toXmlBean
	 *            toXmlBean
	 * @return java.lang.String
	 * @author liugang
	 * @since 2019/4/16 21:43
	 */
	public static String beanToXml(Object toXmlBean) {
		return beanToXml("xml", toXmlBean);
	}

	/**
	 * 对象转xml
	 *
	 * @param xml
	 *            xml
	 * @param 
	 *            clazz
	 * @return T
	 * @author liugang
	 * @since 2019/4/16 21:43
	 */
	public static  T xmlToBean(String xml, Class clazz) {
		XStream xStream = new XStream(new DomDriver("UTF-8")) {
			/**
			 * 忽略xml中多余字段
			 */
			@Override
			protected MapperWrapper wrapMapper(MapperWrapper next) {
				return new MapperWrapper(next) {
					@SuppressWarnings("rawtypes")
					@Override
					public boolean shouldSerializeMember(Class definedIn,
							String fieldName) {
						if (definedIn == Object.class) {
							return false;
						}
						return super.shouldSerializeMember(definedIn,
								fieldName);
					}
				};
			}
		};

		// 设置默认的安全校验
		XStream.setupDefaultSecurity(xStream);
		// 使用本地的类加载器
		xStream.setClassLoader(HcXmlUtils.class.getClassLoader());
		// 允许所有的类进行转换
		xStream.addPermission(AnyTypePermission.ANY);
		xStream.processAnnotations(clazz);
		xStream.alias("xml", clazz);
		Object object = xStream.fromXML(xml);
		return clazz.cast(object);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy