dom4j 通用解析器,解析成List<Map<String,Object>>

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的配置文件,自定義文件,均可正常解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章