自己近期在做一個微信自定義菜單掃一掃的項目,一切配置都妥當之後,發現到後臺將 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 層子元素,遍歷都沒有問題,但這種寫法最起碼達到了我想要的那種效果,所以後期有時間再進行改寫吧。
學無止境,生生不息。