微信公衆號獲取 ScanCodeInfo 裏掃出的值

自己近期在做一個微信自定義菜單掃一掃的項目,一切配置都妥當之後,發現到後臺將 xml 轉 map 時獲取不到掃碼值,在百度上尋找解決方案無果之下,自己嘗試着摸索了一下,弄出了一個方案。

我們獲取到掃一掃的 xml 內容大致是這樣的:

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 層子元素,遍歷都沒有問題,但這種寫法最起碼達到了我想要的那種效果,所以後期有時間再進行改寫吧。

 

學無止境,生生不息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章