網上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 = "<note>\n" +
" <name>張三</name>\n" +
" <age>18</age>\n" +
" <hobby>\n" +
" <aa>籃球</aa>\n" +
" <bb>足球</bb>\n" +
" </hobby>\n" +
" </note>";
System.out.println(XmlUtil.xmlToMap(xmlStr));
}
}
測試xml報文
<note>
<name>張三</name>
<age>18</age>
<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 = "<note>\n" +
" <name>張三</name>\n" +
" <age>18</age>\n" +
" <hobby>\n" +
" <aa>籃球</aa>\n" +
" <bb>足球</bb>\n" +
" </hobby>\n" +
" </note>";
System.out.println(XmlUtil.xmlToMap(xmlStr));
}
}
代碼裏面增加父級目錄的概念,繼續使用該報文測試:
{name=張三, hobby.aa=籃球, hobby.bb=足球, age=18}
此時,map裏面的key全部增加了目錄,可以很清楚的看到xml的層級結構,爲了驗證迭代效果,我們再增加一級目錄測試一下
測試報文升級:
<note>
<name>張三</name>
<age>18</age>
<hobby>
<aa>籃球</aa>
<attr>
<color>黃色</color>
</attr>
<bb>足球</bb>
</hobby>
</note>
測試結果如下:
{name=張三, hobby.aa=籃球, hobby.bb=足球, hobby.attr.color=黃色, age=18}
ok,此時已經可以完全驗證小工具的使用情況了
很多東西,簡單的想法會帶來更大的收益!