java解析xml转为Map
生活随笔
收集整理的這篇文章主要介紹了
java解析xml转为Map
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
之前開發(fā)過一個解析多層級xml文件的工具類,后來處理的時候發(fā)現(xiàn),這種方式得到的map或json集合多一個key標簽,在解析的時候會比較麻煩,于是根據(jù)需要在原有方法的基礎(chǔ)上寫出了另外的處理方法,總結(jié)記錄如下:
1、單節(jié)點單層級、單節(jié)點多層級xml轉(zhuǎn)map
import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;/*** 功能:XML解析工具類* @author lmb * @version 1.0* @date 2017-6-5*/ public class ParseXMLUtils {/*** 將Document對象轉(zhuǎn)為Map(String→Document→Map)* @param Document* @return*/@SuppressWarnings("rawtypes")public static Map<String, Object> Dom2Map(Document doc){ Map<String, Object> map = new HashMap<String, Object>(); if(doc == null) return map; Element root = doc.getRootElement(); for (Iterator iterator = root.elementIterator(); iterator.hasNext();) { Element e = (Element) iterator.next(); //System.out.println(e.getName()); List list = e.elements(); if(list.size() > 0){ map.put(e.getName(), Dom2Map(e)); }else map.put(e.getName(), e.getText()); } return map; }/*** 將Element對象轉(zhuǎn)為Map(String→Document→Element→Map)* @param Element* @return*/@SuppressWarnings({ "unchecked", "rawtypes" })public static Map Dom2Map(Element e){ Map map = new HashMap(); List list = e.elements(); if(list.size() > 0){ for (int i = 0;i < list.size(); i++) { Element iter = (Element) list.get(i); List mapList = new ArrayList(); if(iter.elements().size() > 0){ Map m = Dom2Map(iter); if(map.get(iter.getName()) != null){ Object obj = map.get(iter.getName()); if(!obj.getClass().getName().equals("java.util.ArrayList")){ mapList = new ArrayList(); mapList.add(obj); mapList.add(m); } if(obj.getClass().getName().equals("java.util.ArrayList")){ mapList = (List) obj; mapList.add(m);} map.put(iter.getName(), mapList); }else map.put(iter.getName(), m); } else{ if(map.get(iter.getName()) != null){ Object obj = map.get(iter.getName()); if(!obj.getClass().getName().equals("java.util.ArrayList")){ mapList = new ArrayList(); mapList.add(obj); mapList.add(iter.getText()); } if(obj.getClass().getName().equals("java.util.ArrayList")){ mapList = (List) obj; mapList.add(iter.getText()); } map.put(iter.getName(), mapList); }else map.put(iter.getName(), iter.getText());//公共map resultCode=0} } }else map.put(e.getName(), e.getText()); return map; } public static void main(String[] args) { String str1 = "<HEADER>" +" <POOL_ID>2</POOL_ID>" +" <DB_ID>EUR</DB_ID>" +" <CHANNEL_ID>11</CHANNEL_ID>" +" <USERNAME>tom</USERNAME>" +" <PASSWORD>sss</PASSWORD>" +" </HEADER>";String str2 = "<ROOT>" +" <HEADER>" +" <POOL_ID>2</POOL_ID>" +" <CHANNEL_ID>11</CHANNEL_ID>" +" <USERNAME>tom</USERNAME>" +" <PASSWORD>sss</PASSWORD>" +" </HEADER>" +" <BODY>" +" <BUSLIST>" +" <PHONE_NO>7107300212</PHONE_NO>" +" <TRACE_ID>97D2C7D26224A2DAE9A1CB501E60F395</TRACE_ID>" +" <TENANT_ID>EUR</TENANT_ID>" +" <LANG>zh_CN</LANG>" +" </BUSLIST>" +" <BUSLIST>" +" <PHONE_NO>2222300212</PHONE_NO>" +" <TRACE_ID>444424A2DAE9A1CB501E60F395</TRACE_ID>" +" <TENANT_ID>USA</TENANT_ID>" +" <LANG>zh_CN</LANG>" +" </BUSLIST>" +" </BODY>" +"</ROOT>";SAXReader saxReader = new SAXReader();Document document;try {document = saxReader.read(new ByteArrayInputStream(str1.getBytes()));Map map = Dom2Map(document);System.out.println("map>>> " + map);/*{DB_ID=EUR, CHANNEL_ID=11, USERNAME=tom, PASSWORD=sss, POOL_ID=2}{BODY={BUSLIST=[{TRACE_ID=97D2C7D26224A2DAE9A1CB501E60F395, PHONE_NO=7107300212, LANG=zh_CN, TENANT_ID=EUR}, {TRACE_ID=444424A2DAE9A1CB501E60F395, PHONE_NO=2222300212, LANG=zh_CN, TENANT_ID=USA}]}, HEADER={CHANNEL_ID=11, USERNAME=tom, PASSWORD=sss, POOL_ID=2}}*/} catch (DocumentException e) {e.printStackTrace();}} }2、多結(jié)點多層級的xml轉(zhuǎn)map
在上面方法的基礎(chǔ)上又開發(fā)出基于地段節(jié)點層級關(guān)系的多結(jié)點多層級xml轉(zhuǎn)平級map的方法:
import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.simpleproxy.dataparse.xml.ParseXMLUtils; /*** 功能:通過屬性文件處理XML報文* @author lmb * @version 1.0* @date 2017-6-5*/ public class ParseXmlByPropertyFile {/*** 將多結(jié)點多層級的Map轉(zhuǎn)為多包體的list集合* @param respStr* @param listNode* @return*/public static List<Map<String,Object>> map2ListbyHandler(Map respStr,String listNode){List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();Map map = respStr;String[] strArray = listNode.split(">");String key = null;Object value = null;for (int i = 0; i < strArray.length; i++) {if (map.get(strArray[i]) instanceof List) {if (i < strArray.length - 1 && null != map.get(strArray[i]) && "" != map.get(strArray[i])) {Map<String,Object> mapList = map;if (((List<Map<String,Object>>)mapList.get(strArray[i])).size() > 0) {for (int j = 0; j < ((List<Map<String,Object>>)mapList.get(strArray[i])).size(); j++) {Map mapj = new HashMap();map = ((List<Map<String,Object>>)mapList.get(strArray[i])).get(j);mapj.put(strArray[i+1],map.get(strArray[i + 1])+"");//listNoderesultList.add(mapj);}}}break;}else{if (i < strArray.length - 1 && null != map.get(strArray[i]) && "" != map.get(strArray[i])) {map = (Map) map.get(strArray[i]);}else{Map<String,Object> resultMap = new HashMap<String,Object>();resultMap.put(strArray[i],map.get(strArray[i])+"");//listNoderesultList.add(resultMap);}}}System.out.println("resultList >>> " + resultList);return resultList; }/*** 根據(jù)節(jié)點的list集合將xml報文組裝成多包體list* @param nodeList* @param respXml* @return*/public static List<Map<String,Object>> str2ListbyHandler(List<String> nodeList,String respXml){Map<String,Object> resultMap = new HashMap<String,Object>();List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();Map<String,Object> commonMap = new HashMap<String,Object>();int flag = 0;try{for (String node :nodeList){SAXReader saxReader = new SAXReader();Document document = saxReader.read(new ByteArrayInputStream(respXml.getBytes()));Element incomingForm = document.getRootElement();Map map = ParseXMLUtils.Dom2Map(incomingForm);List<Map<String,Object>> thirdList = map2ListbyHandler(map,node);List<Map<String,Object>> listGroup = new ArrayList<Map<String,Object>>();List<Map<String,Object>> maxList = new ArrayList<Map<String,Object>>();List<Map<String,Object>> minList = new ArrayList<Map<String,Object>>();//----------------------------------if (thirdList.size() > 0 && thirdList.size() < 2) {//公共參數(shù)commonMap.putAll(thirdList.get(0));}else{//某節(jié)點下為list集合;比較list集合的大小if (flag == 0) {resultList = thirdList;}else {if (resultList.size() < thirdList.size()) {maxList = thirdList;minList = resultList;}else{maxList = resultList;minList = thirdList;}for (int i = 0; i < maxList.size(); i++) {for (int j = 0; j < minList.size(); j++) {Map<String,Object> mapGroup = new HashMap<String,Object>();mapGroup.putAll(thirdList.get(i));mapGroup.putAll(resultList.get(j));listGroup.add(mapGroup);System.out.println("listGroup >> " + listGroup);}}resultList = listGroup; }flag++;}//-----------------------}if (resultList.size() == 0) {resultList.add(commonMap);}else{for (int i = 0; i < resultList.size(); i++) {resultList.get(i).putAll(commonMap);}}}catch(Exception e){}System.out.println("resultList >> " + resultList);return resultList;}public static void main(String[] args) {StringBuffer sb = new StringBuffer();sb.append("<response>");sb.append(" <resultCode>0</resultCode>");sb.append(" <resultMsg>成功</resultMsg>");sb.append(" <orderOffer>");sb.append(" <offer>");sb.append(" <offerId>105000808918</offerId>");sb.append(" <offerSpecId>980010992</offerSpecId>");sb.append(" <offerSpecName>980010992)商務(wù)助手(OCS)30元</offerSpecName>");sb.append(" <startDt>2012-11-27 16:48:12</startDt>");sb.append(" <endDt>3000-1-1 0:00:00</endDt>");sb.append(" <params>");sb.append(" <param>");sb.append(" <offerParamId>101000048281</offerParamId>");sb.append(" <itemSpecId>5030</itemSpecId>");sb.append(" <itemSpecName>計費區(qū)分</itemSpecName>");sb.append(" <value>CDMA預(yù)付費</value>");sb.append(" </param>");sb.append(" <param>");sb.append(" <offerParamId>101000048282</offerParamId>");sb.append(" <itemSpecId>5031</itemSpecId>");sb.append(" <itemSpecName>經(jīng)分區(qū)分</itemSpecName>");sb.append(" <value>天翼商話</value>");sb.append(" </param>");sb.append(" </params>");sb.append(" </offer>");sb.append(" </orderOffer>");sb.append(" <saleOffer>");sb.append(" <categoryNode id = \"100472\">");sb.append(" <offer>");sb.append(" <id>980001995</id>");sb.append(" <name>(980001995)商務(wù)助手(OCS)201209版-30元</name>");sb.append(" <summary>待定...</summary>");sb.append(" </offer>");sb.append(" <offer>");sb.append(" <id>980001996</id>");sb.append(" <name>(980001996)商務(wù)助手(OCS)201209版-50元</name>");sb.append(" <summary>待定...</summary>");sb.append(" </offer>");sb.append(" <offer>");sb.append(" <id>980001997</id>");sb.append(" <name>(980001997)商務(wù)助手(OCS)201209版-80元</name>");sb.append(" <summary>待定...</summary>");sb.append(" </offer>");sb.append(" <offer>");sb.append(" <id>980010993</id>");sb.append(" <name>(980010993)商務(wù)助手(OCS)50元</name>");sb.append(" <summary>待定...</summary>");sb.append(" </offer>");sb.append(" </categoryNode>");sb.append(" </saleOffer>");sb.append("</response>");String respXml = sb.toString();try {//xml轉(zhuǎn)mapSAXReader saxReader = new SAXReader();Document document = saxReader.read(new ByteArrayInputStream(respXml.getBytes()));Element incomingForm = document.getRootElement();Map map = ParseXMLUtils.Dom2Map(incomingForm);System.out.println("map >>> "+ map);/** {resultMsg=成功, orderOffer={offer={offerSpecName=980010992)商務(wù)助手(OCS)30元, endDt=3000-1-1 0:00:00, startDt=2012-11-27 16:48:12, offerSpecId=980010992, params={param=[{offerParamId=101000048281, itemSpecName=計費區(qū)分, itemSpecId=5030, value=CDMA預(yù)付費}, {offerParamId=101000048282, itemSpecName=經(jīng)分區(qū)分, itemSpecId=5031, value=天翼商話}]}, offerId=105000808918}}, resultCode=0, saleOffer={categoryNode={offer=[{summary=待定..., id=980001995, name=(980001995)商務(wù)助手(OCS)201209版-30元}, {summary=待定..., id=980001996, name=(980001996)商務(wù)助手(OCS)201209版-50元}, {summary=待定..., id=980001997, name=(980001997)商務(wù)助手(OCS)201209版-80元}, {summary=待定..., id=980010993, name=(980010993)商務(wù)助手(OCS)50元}]}}}*/System.out.println("***************從map中將單個節(jié)點的值查找出來*********************");//map轉(zhuǎn)listmap2ListbyHandler(map,"saleOffer>categoryNode>offer>id");/** resultList >>> [{id=980001995}, {id=980001996}, {id=980001997}, {id=980010993}]*/System.out.println("***************從map中將節(jié)點集合中的所有節(jié)點值都查找出來*******************************");List<String> nodeList = new ArrayList<String>();nodeList.add("resultCode");nodeList.add("resultMsg");nodeList.add("orderOffer>offer>offerSpecName");nodeList.add("orderOffer>offer>endDt");nodeList.add("orderOffer>offer>startDt");nodeList.add("orderOffer>offer>offerSpecId");nodeList.add("orderOffer>offer>offerId");nodeList.add("orderOffer>offer>params>param>offerParamId");nodeList.add("orderOffer>offer>params>param>itemSpecName");nodeList.add("orderOffer>offer>params>param>itemSpecId");nodeList.add("orderOffer>offer>params>param>value");nodeList.add("saleOffer>categoryNode>offer>id");nodeList.add("saleOffer>categoryNode>offer>summary");nodeList.add("saleOffer>categoryNode>offer>name");str2ListbyHandler(nodeList,respXml);/*** [{offerParamId=101000048281, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980001995, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12, * name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}, * {offerParamId=101000048282, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980001995, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12, * name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}, * {offerParamId=101000048281, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980001996, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12, * name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}, * {offerParamId=101000048282, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980001996, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12, * name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}, * {offerParamId=101000048281, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980001997, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12, * name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}, * {offerParamId=101000048282, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980001997, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12,* name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}, * {offerParamId=101000048281, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980010993, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12, * name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}, * {offerParamId=101000048282, summary=待定..., endDt=3000-1-1 0:00:00, itemSpecId=5031, id=980010993, resultMsg=成功, * itemSpecName=經(jīng)分區(qū)分, offerSpecName=980010992)商務(wù)助手(OCS)30元, offerSpecId=980010992, startDt=2012-11-27 16:48:12, * name=(980010993)商務(wù)助手(OCS)50元, resultCode=0, value=天翼商話, offerId=105000808918}]*/} catch (DocumentException e) {e.printStackTrace();}} }總結(jié)
以上是生活随笔為你收集整理的java解析xml转为Map的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7防火墙firewalld和
- 下一篇: java解析json转Map