Map與Xml互轉

package com.ltf.utils;

import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
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 org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * Map與Xml互轉工具類
 * @author xhz
 *
 */
public class XMLUtil {

	/**
	 * 將Map轉換爲XML格式的字符串
	 *
	 * @param data Map類型數據
	 * @return XML格式的字符串
	 * @throws Exception
	 */
	public static String mapToXml(Map<String, String> data) {
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
			org.w3c.dom.Document document = documentBuilder.newDocument();
			org.w3c.dom.Element root = document.createElement("xml");
			document.appendChild(root);
			for (String key: data.keySet()) {
				String value = data.get(key);
				if (value == null) {
					value = "";
				}
				value = value.trim();
				org.w3c.dom.Element filed = document.createElement(key);
				filed.appendChild(document.createTextNode(value));
				root.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 writer = new StringWriter();
			StreamResult result = new StreamResult(writer);
			transformer.transform(source, result);
			String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
			writer.close();
			String str1=output.substring(0, output.indexOf(">"));
			String str2=output.substring(str1.length()+1, output.length());
			return str2;
		} catch (Exception e) {  
			e.printStackTrace();  
			return null;
		} 
	}

	/**
	 * xml轉爲map,map中有list(節點相同時候),list中有map
	 * @param xml
	 * @return
	 * @throws DocumentException
	 */
	public static Map<String, Object> xmlToMap(String xml) throws DocumentException {
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			SAXReader saxReader = new SAXReader();
			Document document = saxReader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));//xml串第一行不能有空格,否則報錯
			Element root = document.getRootElement();//得到xml文檔根節點元素,即最上層的"<xml>"
			elementTomap(root, map);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return map;
	}

	@SuppressWarnings("unchecked")
	public static Map<String, Object> elementTomap(Element outele, Map<String, Object> outmap) {
		try {
			List<Element> list = outele.elements();
			int size = list.size();
			if (size == 0) {
				outmap.put(outele.getName(), outele.getTextTrim());
			} else {
				Map<String, Object> innermap = new HashMap<String, Object>();
				int i = 1;

				for (Element ele1 : list) {
					String eleName = ele1.getName();

					String value = ele1.getText();
					Object obj = innermap.get(eleName);
					if (obj == null) {
						elementTomap(ele1, innermap);
					} else {
						if (obj instanceof java.util.Map) {
							List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
							list1.add((Map<String, Object>) innermap.remove(eleName));
							elementTomap(ele1, innermap);
							list1.add((Map<String, Object>) innermap.remove(eleName));
							innermap.put(eleName, list1);
						} else if (obj instanceof String) {
							innermap.put(eleName + i, value);
							i++;
						} else {
							elementTomap(ele1, innermap);
							Map<String, Object> listValue = (Map<String, Object>) innermap.get(eleName);
							((List<Map<String, Object>>) obj).add(listValue);
							innermap.put(eleName, obj);
						}

					}
				}
				outmap.put(outele.getName(), innermap);
			}
			return outmap;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public static void main(String[] args) throws Exception {
		//HashMap是無序的,但是,要說到添加順序,那就只有LinkedHashMap啦
		Map<String, String> data=new LinkedHashMap<String, String>();
		data.put("name", "盒子");
		data.put("love", "愛");
		data.put("eat", "吃");
		data.put("pomelo", "柚子");
		String xml=mapToXml(data);
		System.out.println("【map轉xml得到的結果】:"+xml);
		System.out.println("【xml轉map得到的結果】:"+xmlToMap(xml));
	}

}

運行main()得到如下結果:

OK,Perfect!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章