java将字符串转为map(JavaXML转换为Map)
java将字符串转为map(JavaXML转换为Map)XML解析Map(方法二)详细代码:
XML解析为Map,相同的节点会被覆盖,只保留最后一次解析的值(方法一)XML解析Map(方法一)
详细代码:
/***
* xml解析为map,相同的节点会被覆盖,只保留最后一次解析的值
* @param xml
* @return
*/
public static Map<String Object> xmlToMap(String xml) {
if (StringUtils.isBlank(xml)) return null;
Document doc = null;
try {
doc = DocumentHelper.parseText(xml);
} catch (DocumentException e) {
e.printStackTrace();
}
Map<String Object> map = new HashMap<>();
if (null == doc) {
return map;
}
// 获取根元素
Element rootElement = doc.getRootElement();
elementToMap(map rootElement);
return map;
}
/***
* 相同节点会被覆盖,只保存最后一个节点的值。
* elementToMap核心方法,递归调用
* @param element 节点元素
* @param outmap 用于存储xml数据的map
*/
private static void elementToMap(Map<String Object> outmap Element element) {
// 得到根元素下的子元素列表
List<Element> list = element.elements();
int size = list.size();
if (size == 0) {
// 如果没有子元素 则将其存储进map中
outmap.put(element.getName() element.getTextTrim());
} else {
// innermap用于存储子元素的属性名和属性值
Map<String Object> innermap = new HashMap<>();
// 遍历子元素
list.forEach(childElement -> elementToMap(innermap childElement));
outmap.put(element.getName() innermap);
}
}
XML解析Map(方法二)
详细代码:
/***
* xml格式字符串转换为map 相同节点同样被解析出来
* @param xml xml字符串
* @return 第一个为Root节点,Root节点之后为Root的元素,如果为多层,可以通过key获取下一层Map
*/
public static Map<String Object> dom4jXmlToMap(String xml) {
if (StringUtils.isBlank(xml)) return null;
Document doc = null;
try {
doc = DocumentHelper.parseText(xml);
} catch (DocumentException e) {
e.printStackTrace();
}
Map<String Object> map = new HashMap<>();
if (null == doc) {
return map;
}
// 获取根元素
Element rootElement = doc.getRootElement();
dom4jElementToMap(map rootElement);
return map;
}
/***
* 相同节点会全部解析出来。
* 使用递归调用将多层级xml转为map
* @param map
* @param rootElement
*/
private static void dom4jElementToMap(Map<String Object> map Element rootElement) {
//获得当前节点的子节点
List<Element> elements = rootElement.elements();
if (elements.size() == 0) {
//没有子节点说明当前节点是叶子节点,直接取值
map.put(rootElement.getName() rootElement.getText());
} else if (elements.size() == 1) {
//只有一个子节点说明不用考虑list的情况,继续递归
Map<String Object> tempMap = new HashMap();
dom4jElementToMap(tempMap elements.get(0));
map.put(rootElement.getName() tempMap);
} else {
//多个子节点的话就要考虑list的情况了,特别是当多个子节点有名称相同的字段时
Map<String Object> tempMap = new HashMap();
for (Element element : elements) {
tempMap.put(element.getName() null);
}
Set<String> keySet = tempMap.keySet();
for (String string : keySet) {
namespace namespace = elements.get(0).getNamespace();
List<Element> sameElements = rootElement.elements(new QName(string namespace));
//如果同名的数目大于1则表示要构建list
if (sameElements.size() > 1) {
List<Map> list = new ArrayList();
for (Element element : sameElements) {
Map<String Object> sameTempMap = new HashMap();
dom4jElementToMap(sameTempMap element);
list.add(sameTempMap);
}
map.put(string list);
} else {
//同名的数量不大于1直接递归
Map<String Object> sameTempMap = new HashMap();
dom4jElementToMap(sameTempMap sameElements.get(0));
map.put(string sameTempMap);
}
}
}
}