网上xml转map的例子很多,大多原理都差不多,但是好用的并不多,这里自己写了小工具,效果谁用谁知道
代码示例
import com.google.common.collect.Maps;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.List;
import java.util.Map;
/**
* @author yanghao
* @version XmlUtil.java, v 0.1 2019-04-08 11:52
*/
public class XmlUtil {
/**
* xml --> map
*/
public static Map<String, Object> xmlToMap(String xmlStr){
Map<String, Object> map = Maps.newHashMap();
try {
Document doc = DocumentHelper.parseText(xmlStr);
//根结点
Element root = doc.getRootElement();
//处理xml
dealElement(root, map);
}catch (Exception e){
e.printStackTrace();
}
return map;
}
/**
* 迭代处理xml --- 放入同级map
* @param element
* @param map
*/
private static void dealElement(Element element, Map<String, Object> map) {
if(element.isTextOnly()){
//单节点
map.put(element.getName(), element.getText());
}else {
//多节点
List<Element> list = element.elements();
for(Element e : list){
//迭代下一次循环
dealElement(e, map);
}
}
}
/**
* 测试类
* @param args
*/
public static void main(String[] args){
String xmlStr = "\n" +
" 张三 \n" +
" 18 \n" +
" \n" +
" 篮球 \n" +
" 足球 \n" +
" \n" +
" ";
System.out.println(XmlUtil.xmlToMap(xmlStr));
}
}
测试xml报文
<note>
<name>张三name>
<age>18age>
<hobby>
<aa>篮球aa>
<bb>足球bb>
hobby>
note>
运行结果如下:
{aa=篮球, bb=足球, name=张三, age=18}
可以看出,xml已经转化成我们需要的map了,并且是同级map里面
这里有一个缺点,如果不同层级的xml节点的key是一样,就会把map里面覆盖掉;并且不能看出这个key的真正节点位置
我们继续优化
import com.google.common.collect.Maps;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.List;
import java.util.Map;
/**
* @author yanghao
* @version XmlUtil.java, v 0.1 2019-04-08 11:52
*/
public class XmlUtil {
/**
* xml --> map
*/
public static Map<String, Object> xmlToMap(String xmlStr){
Map<String, Object> map = Maps.newHashMap();
try {
Document doc = DocumentHelper.parseText(xmlStr);
//根结点
Element root = doc.getRootElement();
//处理xml
dealElement(root.getName(), root, map);
}catch (Exception e){
e.printStackTrace();
}
return map;
}
/**
* 迭代处理xml --- 放入同级map
* @param name 父级目录
* @param element
* @param map
*/
private static void dealElement(String name, Element element, Map<String, Object> map) {
if(element.isTextOnly()){
//单节点
map.put("note".equals(name)? element.getName() : name + "." + element.getName(), element.getText());
}else {
//多节点
List<Element> list = element.elements();
for(Element e : list){
//迭代下一次循环
dealElement("note".equals(name)? element.getName() : name + "." + element.getName(), e, map);
}
}
}
/**
* 测试类
* @param args
*/
public static void main(String[] args){
String xmlStr = "\n" +
" 张三 \n" +
" 18 \n" +
" \n" +
" 篮球 \n" +
" 足球 \n" +
" \n" +
" ";
System.out.println(XmlUtil.xmlToMap(xmlStr));
}
}
代码里面增加父级目录的概念,继续使用该报文测试:
{name=张三, hobby.aa=篮球, hobby.bb=足球, age=18}
此时,map里面的key全部增加了目录,可以很清楚的看到xml的层级结构,为了验证迭代效果,我们再增加一级目录测试一下
测试报文升级:
<note>
<name>张三name>
<age>18age>
<hobby>
<aa>篮球aa>
<attr>
<color>黄色color>
attr>
<bb>足球bb>
hobby>
note>
测试结果如下:
{name=张三, hobby.aa=篮球, hobby.bb=足球, hobby.attr.color=黄色, age=18}
ok,此时已经可以完全验证小工具的使用情况了
很多东西,简单的想法会带来更大的收益!