平时接触xml比较多,解析的时候通常会涉及到xml的节点值,这样每次都需要写一遍类似的代码,比较繁琐。下面这段程序可以适用于各种xml,通过递归将里面的元素和属性封装成一个Map返回。不过有个比较明显的缺点是当xml里面的元素名或者属性名重复时,后面的会将前面的覆盖掉。
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class XmlUtil {
/**
* 传入一个xml格式的字符串,返回map,适用于无相同的节点时
*
* @param xml
* @return
* @throws DocumentException
*/
public static Map getNodeData(String xml)
throws DocumentException {
Map resultMap = new HashMap();
Document doc;
doc = DocumentHelper.parseText(xml);
Element elem = doc.getRootElement();
return getElementList(elem, resultMap);
}
/**
* 递归遍历方法
*
* @param element
*/
public static Map getElementList(Element element,
Map resultMap) {
List elements = element.elements();
if (elements.size() == 0) {
// 没有子元素
resultMap.put(element.getName(), element.getTextTrim());
// 获取属性值
List arrtList = element.attributes();
for (int i = 0; i < arrtList.size(); i++) {
Attribute attr = (Attribute) arrtList.get(i);
resultMap.put(attr.getName(), attr.getValue().trim());
}
} else {
// 有子元素
for (Iterator it = elements.iterator(); it.hasNext();) {
Element elem = (Element) it.next();
// 递归遍历
getElementList(elem, resultMap);
}
}
return resultMap;
}
}