说明:除head、body节点合并为一个Map,其余的都进行List<Map>转换;
比如XML:
则节点<tran>为一个Map,VALUE为List<Map>,其中<rcd>节点不显示名称,具体代码如下:
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.DocumentHelper; import org.dom4j.Element; public class XmlUtils { private static final String HEAD = "head"; private static final String BODY = "body"; public static void main(String[] args) throws DocumentException { String xml = "<ap> <head> <tr_code>330003</tr_code> <corp_no>8000500436</corp_no> <user_no>22222</user_no> <req_no>123456789001</req_no> <tr_acdt>20160510</tr_acdt> <tr_time>151238</tr_time> <atom_tr_count>1</atom_tr_count> <channel>0</channel> <reserved /> </head> <body> <cert_no>TEST01234</cert_no> <pay_acno>310066865018010123060</pay_acno> <type>S</type> <sum>1</sum> <sum_amt>0.01</sum_amt> <pay_month>201605</pay_month> <summary>测试0.01</summary> <busi_no>3100012379</busi_no> <selsec_flg>0</selsec_flg><tran><rcd><card_no>00000001</card_no><acname>测试账号</acname><card_flag>0</card_flag><amt>21.01</amt><busino>111111111</busino></rcd><rcd><card_no>00000001</card_no><acname>测试账号</acname><card_flag>0</card_flag><amt>21.01</amt><busino>111111111</busino></rcd></tran> </body></ap>"; System.out.println(parseXmlStr(xml).toString()); } /** * 解析XML字符串 * * @param xml * @return * @throws DocumentException */ private static Map<String,Object> parseXmlStr(String xml) throws DocumentException { Document document = DocumentHelper.parseText(xml); Element root = document.getRootElement(); return parseElement(root); } /** * 解析Element * * @param root * @return */ @SuppressWarnings("unchecked") private static Map<String,Object> parseElement(Element root) { String rootName = root.getName(); Iterator<Element> rootItor = root.elementIterator(); Map<String,Object> rMap = new HashMap<>(); List<Map<String,Object>> rList = new ArrayList<>(); Map<String,Object> rsltMap = null; while (rootItor.hasNext()) { Element tmpElement = rootItor.next(); String name = tmpElement.getName(); if (rsltMap == null || (!HEAD.equals(name) && !BODY.equals(name) && !tmpElement.isTextOnly())) { if (!HEAD.equals(name) && !BODY.equals(name) && !tmpElement.isTextOnly() && rsltMap != null) { rList.add(rsltMap); } rsltMap = new HashMap<>(); } if (!tmpElement.isTextOnly()) { Iterator<Element> headItor = tmpElement.elementIterator(); while (headItor.hasNext()) { Element hElement = headItor.next(); if (hElement.isTextOnly()) { rsltMap.put(hElement.getName(),hElement.getTextTrim()); } else { rsltMap.putAll(parseElement(hElement)); } } } } rList.add(rsltMap); rMap.put(rootName,rList); return rMap; } }
测试结果:
{ap=[{summary=测试0.01,tr_time=151238,cert_no=TEST01234,channel=0,tr_code=330003,sum=1,type=S,pay_month=201605,req_no=123456789001,user_no=22222,tr_acdt=20160510,sum_amt=0.01,reserved=,atom_tr_count=1,pay_acno=310066865018010123060,busi_no=3100012379,corp_no=8000500436,selsec_flg=0,tran=[{acname=测试账号,card_no=00000001,card_flag=0,amt=21.01,busino=111111111},{acname=测试账号,busino=111111111}]}]}