import java.io.InputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Dom4JXmlConvert { /** * dom4j解析xml * * @param in * @return */ @SuppressWarnings("unchecked") public static List<Map<String, Object>> convert(InputStream in) { long start = System.currentTimeMillis(); List<Map<String, Object>> lst = new LinkedList<>(); SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read(in); // 獲取根節點 Element root = document.getRootElement(); // 迭代根節點下的所有子節點 Iterator<Element> itertor = root.elementIterator(); Element eleNext = null; // 遍歷子節點 while (itertor.hasNext()) { eleNext = itertor.next(); Map<String, Object> tmp = parseElement(eleNext); lst.add(tmp); } System.out.println("本次解析XML耗時:" + (System.currentTimeMillis() - start)); } catch (DocumentException e) { e.printStackTrace(); } return lst; } @SuppressWarnings({ "unchecked" }) private static Map<String, Object> parseElement(Element ele) { Map<String, Object> map = new LinkedHashMap<String, Object>(); // 遍歷節點屬性 Iterator<Attribute> iterAttr = ele.attributeIterator(); // 遍歷時的中間遍量 Attribute attr = null; // 遍歷 while (iterAttr.hasNext()) { attr = iterAttr.next(); map.put(attr.getQName().getName(), attr.getValue()); } // 如果該節點沒有子節點,則添加標籤名和標籤中間的字符到map,如果還有子節點,遞歸遍歷 Iterator<Element> itertor = ele.elementIterator(); if (!itertor.hasNext()) { map.put(ele.getName(), ele.getStringValue()); } else { List<Map<String, Object>> lst = new LinkedList<>(); while (itertor.hasNext()) { lst.add(parseElement(itertor.next())); } map.put(ele.getName(), lst); } return map; } }
測試解析spring的配置文件,自定義文件,均可正常解析