微信公众号获取 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 层子元素,遍历都没有问题,但这种写法最起码达到了我想要的那种效果,所以后期有时间再进行改写吧。

 

学无止境,生生不息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值