使用dom4j将xml字符串解析为map:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
@SuppressWarnings("unchecked")
public class XmlParser {
public static Map<String,Object> readData(Element ele){
Map<String,Object> map = new HashMap<String,Object>();
//得到元素列表遍历
List<Element> eList = ele.elements();
for(Element e : eList){
if(e.elements().isEmpty()){
//如果该元素子元素为空,则直接获取文本
// e.getData() e.getStringValue();e.getText()e.getTextTrim()
map.put(e.getName(), e.getText());
}else{
//若有子元素,则递归取值
map.put(e.getName(), readData(e));
}
}
return map;
}
public static Map<String,Object> readXml(String xml){
Map<String,Object> map = null;
try{
Document doc = DocumentHelper.parseText(xml);
// 获取根节点
Element rootElt = doc.getRootElement();
//通过根节点获取数据
map = readData(rootElt);
}catch(Exception e){
e.printStackTrace();
}
return map;
}
public static void main(String[] args) {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><a><c> 6 6 </c></a><b>2</b></root>";
Map<String,Object> root = readXml(str);
for (Map.Entry<String, Object> entry : root.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
备注:
1)代码中使用元素名称作为key,如果需要使用某些属性值作为key,可以使用attributeValue方法取得名称作为key。
2)取得节点值有四个方法:e.getData() e.getStringValue() e.getText() e.getTextTrim()
其中getText和getTextTrim两个的区别看名称就可以理解,getTextTrim是取除左右空格的(内容中如果有两个或两个以上的空格会转为一个空格);getStringValue是取该节点下全部的string,若有子标签,会将子标签中的文本拼成一个字符串返回,说白了就是将该元素下所有的元素标签去掉以后的内容的拼接;getData的话,经过测试,所得结果和getText一致。
3)使用反射可以将map转换为Javabean对象(代码懒得写了=_=)。