package com.people.xmlToSql; import java.io.File; import java.io.IOException; import java.io.StringWriter; import org.jdom.Document; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; /** * 讀取一個xml文件返回string * @author lmb * */ public class T { /** * 加載xml文件 * @return Document */ public static Document load(){ Document document=null; String url="E://QQ//batch2.xml"; try { SAXBuilder reader = new SAXBuilder(); document=reader.build(new File(url)); } catch (Exception e) { e.printStackTrace(); } return document; } /** * 將xml文件轉換為String串 * @return */ public static String XmlToString(){ Document document=null; document=load(); Format format =Format.getPrettyFormat(); format.setEncoding("UTF-8");//設置編碼格式 StringWriter out=null; //輸出對象 String sReturn =""; //輸出字符串 XMLOutputter outputter =new XMLOutputter(); out=new StringWriter(); try { outputter.output(document,out); } catch (IOException e) { e.printStackTrace(); } sReturn=out.toString(); return sReturn; } }
package com.people.xmlToSql; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import net.sf.json.JSONObject; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Namespace; import org.dom4j.QName; /** * 解析xml的工具類 * 1、將多層級xml解析為Map * 2、將多層級xml解析為Json * * @author lmb * */ public class T1 { public static Logger logger = Logger.getLogger(T1.class); public static void main(String[] args) { // 獲取一個xml文件 String textFromFile = T.XmlToString(); //將xml解析為Map // Map resultMap = xml2map(textFromFile); //將xml解析為Json String resultJson = xml2Json(textFromFile); } /** * 將xml格式響應報文解析為Json格式 * @param responseXmlTemp * @return */ public static String xml2Json(String responseXmlTemp) { Document doc = null; try { doc = DocumentHelper.parseText(responseXmlTemp); } catch (DocumentException e) { logger.error("parse text error : " + e); } Element rootElement = doc.getRootElement(); Map<String,Object> mapXml = new HashMap<String,Object>(); element2Map(mapXml,rootElement); String jsonXml = JSONObject.fromObject(mapXml).toString(); System.out.println("Json >>> " + jsonXml); return jsonXml; } /** * 將xml格式響應報文解析為Map格式 * @param responseXmlTemp * @param thirdXmlServiceBean * @return * @throws DocumentException */ public static Map<String, Object> xml2map(String responseXmlTemp) { Document doc = null; try { doc = DocumentHelper.parseText(responseXmlTemp); } catch (DocumentException e) { logger.error("parse text error : " + e); } Element rootElement = doc.getRootElement(); Map<String,Object> mapXml = new HashMap<String,Object>(); element2Map(mapXml,rootElement); System.out.println("Map >>> " + mapXml); return mapXml; } /** * 使用遞歸調用將多層級xml轉為map * @param map * @param rootElement */ public static void element2Map(Map<String, Object> map, Element rootElement) { //獲得當前節點的子節點 List<Element> elements = rootElement.elements(); if (elements.size() == 0) { //沒有子節點說明當前節點是葉子節點,直接取值 map.put(rootElement.getName(),rootElement.getText()); }else if (elements.size() == 1) { //只有一個子節點說明不用考慮list的情況,繼續遞歸 Map<String,Object> tempMap = new HashMap<String,Object>(); element2Map(tempMap,elements.get(0)); map.put(rootElement.getName(),tempMap); }else { //多個子節點的話就要考慮list的情況了,特別是當多個子節點有名稱相同的字段時 Map<String,Object> tempMap = new HashMap<String,Object>(); for (Element element : elements) { tempMap.put(element.getName(),null); } Set<String> keySet = tempMap.keySet(); for (String string : keySet) { Namespace namespace = elements.get(0).getNamespace(); List<Element> sameElements = rootElement.elements(new QName(string,namespace)); //如果同名的數目大於1則表示要構建list if (sameElements.size() > 1) { List<Map> list = new ArrayList<Map>(); for(Element element : sameElements){ Map<String,Object> sameTempMap = new HashMap<String,Object>(); element2Map(sameTempMap,element); list.add(sameTempMap); } map.put(string,list); }else { //同名的數量不大於1直接遞歸 Map<String,Object> sameTempMap = new HashMap<String,Object>(); element2Map(sameTempMap,sameElements.get(0)); map.put(string,sameTempMap); } } } } }