直接上代码
import org.dom4j.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: lilong
* @Data: Created on 2018/8/28
* @Desc:map和xml转换工具类
*/
public class MapXmlTool {
/**
* xml To map
* @throws Exception
*/
public static Map<String, Object> xmlToMap(String responseXmlTemp) throws DocumentException {
Document doc = DocumentHelper.parseText(responseXmlTemp);
Element rootElement = doc.getRootElement();
Map<String, Object> mapXml = new HashMap<>();
elementToMap(mapXml, rootElement);
return mapXml;
}
/**
* @Author : lilong
* @Description :使用递归调用将多层级xml转为map
* @Date : 9:57 2018/8/28
**/
private static void elementToMap(Map<String, Object> map, Element rootElement) {
// 获得当前节点的子节点
List<Element> childElements = rootElement.elements();
if (childElements.size() > 0) {
Map<String, Object> tempMap = new HashMap<>();
for (Element e : childElements) {
elementToMap(tempMap, e);
map.put(rootElement.getName(), tempMap);
}
} else {
map.put(rootElement.getName(), rootElement.getText());
}
}
/**
* @Author : lilong
* @Description :map 转 xml--不加防转译
* @Date : 15:44 2018/12/24
* @Param : map的key不能用纯数字 否则报错org.w3c.dom.DOMException: INVALID_CHARACTER_ERR: An invalid or illegal XML character is specified.
**/
public static String mapToXmlString(Map<String, String> map) throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
org.w3c.dom.Document document = documentBuilder.newDocument();
org.w3c.dom.Element element = document.createElement("xml");
document.appendChild(element);
for (String key : map.keySet()) {
String value = map.get(key);
if (value == null) {
value = "";
}
value = value.trim();
org.w3c.dom.Element filed = document.createElement(key);
filed.appendChild(document.createTextNode(value));
element.appendChild(filed);
}
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter write = new StringWriter();
StreamResult result = new StreamResult(write);
transformer.transform(source, result);
String output = write.getBuffer().toString();////.replaceAll("\n|\r", "");
try {
write.close();
} catch (Exception e) {
}
return output;
}
/**
* @Author : lilong
* @Description :map转xml---加防转译
* @Date : 10:20 2018/12/24
**/
public static String mapXmlString(Map<String, Object> map) {
String xmlResult = "";
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
for (String key : map.keySet()) {
String value = "<![CDATA[" + map.get(key) + "]]>";
sb.append("<" + key + ">" + value + "</" + key + ">");
}
sb.append("</xml>");
xmlResult = sb.toString();
return xmlResult;
}
}