自己近期在做一个微信自定义菜单扫一扫的项目,一切配置都妥当之后,发现到后台将 xml 转 map 时获取不到扫码值,在百度上寻找解决方案无果之下,自己尝试着摸索了一下,弄出了一个方案。
我们获取到扫一扫的 xml 内容大致是这样的:
xml 里面的 ScanResult 就是扫码值,但它却是 ScanCodeInfo 的子元素,而我现在将 xml 转为 map 的方法是这样的:
/**
* Description: xml 字符串转 map
* @param xml
* @return Map
* @throws Exception
*/
public static Map<String, String> xml2Map(String xml) {
Document doc = null;
try {
doc = DocumentHelper.parseText(xml);
} catch (DocumentException e1) {
e1.printStackTrace();
}
Map<String, String> map = new HashMap<String, String>();
if(doc == null)
return map;
Element root = doc.getRootElement();
@SuppressWarnings("unchecked")
Iterator<Element> iterator = root.elementIterator();
while (iterator.hasNext()) {
Element e = iterator.next();
map.put(e.getName(), e.getText());
}
return map;
}
上面的方法只是读取了根节点元素,并没有再往下读取其他元素,所以 ScanCodeInfo 的值一直都是为空的,找到了问题之后,根据 ScanResult 是 ScanCodeInfo 的下一层子元素,我就直接在 while 循环中再读取了一次子元素,并把子元素放入 map ,这样就能读到 ScanResult 了,方法如下:
/**
* Description: xml 字符串转 map
* @param xml
* @return Map
* @throws Exception
*/
public static Map<String, String> xml2Map(String xml) {
Document doc = null;
try {
doc = DocumentHelper.parseText(xml);
} catch (DocumentException e1) {
e1.printStackTrace();
}
Map<String, String> map = new HashMap<String, String>();
if(doc == null)
return map;
Element root = doc.getRootElement();
@SuppressWarnings("unchecked")
Iterator<Element> iterator = root.elementIterator();
while (iterator.hasNext()) {
Element e = iterator.next();
map.put(e.getName(), e.getText());
@SuppressWarnings("unchecked")
List<Element> sonList = e.elements();
for (Element son : sonList) {
map.put(son.getName(), son.getText());
}
}
return map;
}
这样的写法其实不够不严谨,应该要把上面的方法改写为递归子元素才比较妥当,这样哪怕以后还会多 n 层子元素,遍历都没有问题,但这种写法最起码达到了我想要的那种效果,所以后期有时间再进行改写吧。
学无止境,生生不息。