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);
}
}