引入pom <!-- jdom --> <dependency> <groupId>org.jdom</groupId> <artifactId>jdom2</artifactId> <version>2.0.5</version> </dependency>
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; /** * xml工具类 * */ public final class XmlUtil { private XmlUtil() { throw new Error("工具类不能实例化!"); } /** * 解析String类型的xml流对象InputStream * 解析xml,返回所有键值对。 */ @SuppressWarnings("all") public static Map<String, String> doXMLParse(final String strxml) throws JDOMException, IOException { if (null == strxml || "".equals(strxml)) { return null; } Map<String, String> m = new HashMap<String, String>(); InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8")); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(in); Element root = doc.getRootElement(); List list = root.getChildren(); Iterator it = list.iterator(); while (it.hasNext()) { Element e = (Element) it.next(); String k = e.getName(); String v = ""; List children = e.getChildren(); if (children.isEmpty()) { v = e.getTextNormalize(); m.put(k, v); } else { getChildrenMap(children,m); } } // 关闭流 in.close(); return m; } /** * 获取子结点的map */ @SuppressWarnings("all") private static Map<String, String> getChildrenMap(final List children,Map<String, String> map) { if (!children.isEmpty()) { Iterator it = children.iterator(); while (it.hasNext()) { Element e = (Element) it.next(); String name = e.getName(); String value = e.getTextNormalize(); List list = e.getChildren(); if (!list.isEmpty()) { getChildrenMap(list,map); } map.put(name,value); } } return map; } /** * 将请求参数转换为xml格式的string * 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了. * */ @SuppressWarnings("all") public static String getRequestXml(final SortedMap<String, String> parameters) { StringBuffer sb = new StringBuffer(); sb.append("<xml>"); Set es = parameters.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) { sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">"); } else { sb.append("<" + k + ">" + v + "</" + k + ">"); } } sb.append("</xml>"); return sb.toString(); } /** * 解析String类型的xml流对象InputStream * 解析xml,返回所有键值对。多组的情况 */ @SuppressWarnings("all") public static List<Map<String, String>> doXMLParseByList(final String strxml) throws JDOMException, IOException { if (null == strxml || "".equals(strxml)) { return null; } List<Map<String, String>> listMap = new ArrayList<>(); InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8")); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(in); Element root = doc.getRootElement(); List list = root.getChildren(); Iterator it = list.iterator(); Map<String, String> map = null; while (it.hasNext()) { Element e = (Element) it.next(); String k = e.getName(); String v = ""; List children = e.getChildren(); if (children.isEmpty()) { v = e.getTextNormalize(); map =new HashMap<String, String>(); map.put(k, v); listMap.add(map); } else { getChildrenListMap(children,listMap); } } // 关闭流 in.close(); return listMap; } /** * 获取子结点的map */ @SuppressWarnings("all") private static void getChildrenListMap(final List children,List<Map<String, String>> listMap) { if (!children.isEmpty()) { Iterator it = children.iterator(); Map<String, String> childMap = new HashMap<String, String>(); while (it.hasNext()) { Element e = (Element) it.next(); String name = e.getName(); String value = e.getTextNormalize(); List list = e.getChildren(); if (!list.isEmpty()) { getChildrenListMap(list,listMap); } childMap.put(name,value); } listMap.add(childMap); } } /** * main */ public static void main(final String[] arg) { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sms><mt><status>0</status><account>9522</account></mt></sms>"; String reportXml ="<?xml version=\"1.0\" encoding=\"utf-8\"?> \n" + "<sms> \n" + " <rpt> \n" + " <mobile>13764736306</mobile> \n" + " <msgid>407349913f2e4f578a6c26c4542c39ce</msgid> \n" + " <status>DELIVRD1</status> \n" + " <time>2016-06-08 17:39:38</time> \n" + " <extno/> \n" + " </rpt> \n" + " <rpt> \n" + " <mobile>18017462196</mobile> \n" + " <msgid>6042d26b594b430aa6193da0fe39547e</msgid> \n" + " <status>DELIVRD2</status> \n" + " <time>2016-06-08 17:39:41</time> \n" + " <extno/> \n" + " </rpt> \n" + "</sms> "; try { List<Map<String, String>> mapList = doXMLParseByList(reportXml); System.out.println(mapList.size()); for ( Map<String, String> map:mapList){ System.out.println(map.get("mobile")); System.out.println(map.get("status")); } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }