此文档中包含单层和多层嵌套情况下,xml和map集合进行互转,具体代码如下:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import cn.sdk.util.StringUtil;public class XmlUtil {private static final String PREFIX_XML = "<xml>";private static final String SUFFIX_XML = "</xml>";private static final String PREFIX_CDATA = "<![CDATA[";private static final String SUFFIX_CDATA = "]]>";/*** 转化成xml, 单层无嵌套* @param map* @param isAddCDATA* @return*/public static String mapToXml(Map<Object, Object> parm, boolean isAddCDATA) {StringBuffer strbuff = new StringBuffer(PREFIX_XML);if (null != parm) {for (Entry<Object, Object> entry : parm.entrySet()) {strbuff.append("<").append(entry.getKey()).append(">");if (isAddCDATA) {strbuff.append(PREFIX_CDATA);if (null != entry.getValue()) {strbuff.append(entry.getValue());}strbuff.append(SUFFIX_CDATA);} else {if (null != entry.getValue()) {strbuff.append(entry.getValue());}}strbuff.append("</").append(entry.getKey()).append(">");}}return strbuff.append(SUFFIX_XML).toString();}/*** @description 将xml字符串转换成map* @param xml* @return Map*/public static Map<String, String> xml2Map(String xml) {Map<String, String> map = new HashMap<String, String>();Document doc = null;try {doc = DocumentHelper.parseText(xml); // 将字符串转为XMLElement rootElt = doc.getRootElement(); // 获取根节点@SuppressWarnings("unchecked")List<Element> list = rootElt.elements();// 获取根节点下所有节点for (Element element : list) { // 遍历节点map.put(element.getName(), element.getText()); // 节点的name为map的key,text为map的value}} catch (DocumentException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return map;}/*** (多层)xml格式字符串转换为map** @param xml xml字符串* @return 第一个为Root节点,Root节点之后为Root的元素,如果为多层,可以通过key获取下一层Map*/public static Map<String, Object> multilayerXmlToMap(String xml) {Document doc = null;try {doc = DocumentHelper.parseText(xml);} catch (DocumentException e) {logger.error("xml字符串解析,失败 --> {}", e);}Map<String, Object> map = new HashMap<>();if (null == doc) {return map;}// 获取根元素Element rootElement = doc.getRootElement();recursionXmlToMap(rootElement,map);return map;}/*** multilayerXmlToMap核心方法,递归调用* * @param element 节点元素* @param outmap 用于存储xml数据的map*/@SuppressWarnings("unchecked")private static void recursionXmlToMap(Element element, Map<String, Object> outmap) {// 得到根元素下的子元素列表List<Element> list = element.elements();int size = list.size();if (size == 0) {// 如果没有子元素,则将其存储进map中outmap.put(element.getName(), element.getTextTrim());} else {// innermap用于存储子元素的属性名和属性值Map<String, Object> innermap = new HashMap<>();// 遍历子元素list.forEach(childElement -> recursionXmlToMap(childElement, innermap));outmap.put(element.getName(), innermap);}}/*** (多层)map转换为xml格式字符串** @param map 需要转换为xml的map* @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入* @return xml字符串*/public static String multilayerMapToXml(Map<String, Object> map, boolean isCDATA){String parentName = "xml";Document doc = DocumentHelper.createDocument();doc.addElement(parentName);String xml = recursionMapToXml(doc.getRootElement(), parentName, map, isCDATA);return formatXML(xml);}/*** multilayerMapToXml核心方法,递归调用** @param element 节点元素* @param parentName 根元素属性名* @param map 需要转换为xml的map* @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入* @return xml字符串*/@SuppressWarnings("unchecked")private static String recursionMapToXml(Element element, String parentName, Map<String, Object> map, boolean isCDATA) {Element xmlElement = element.addElement(parentName);map.keySet().forEach(key -> {Object obj = map.get(key);if (obj instanceof Map) {recursionMapToXml(xmlElement, key, (Map<String, Object>)obj, isCDATA);} else {String value = obj == null ? "" : obj.toString();if (isCDATA) {xmlElement.addElement(key).addCDATA(value);} else {xmlElement.addElement(key).addText(value);}}});return xmlElement.asXML();}/*** 格式化xml,显示为容易看的XML格式** @param xml 需要格式化的xml字符串* @return*/public static String formatXML(String xml) {String requestXML = null;try {// 拿取解析器SAXReader reader = new SAXReader();Document document = reader.read(new StringReader(xml));if (null != document) {StringWriter stringWriter = new StringWriter();// 格式化,每一级前的空格OutputFormat format = new OutputFormat(" ", true);// xml声明与内容是否添加空行format.setNewLineAfterDeclaration(false);// 是否设置xml声明头部format.setSuppressDeclaration(false);// 是否分行format.setNewlines(true);XMLWriter writer = new XMLWriter(stringWriter, format);writer.write(document);writer.flush();writer.close();requestXML = stringWriter.getBuffer().toString();}return requestXML;} catch (Exception e) {logger.error("格式化xml,失败 --> {}", e);return null;}}