微信开发03----------XML解析与封装

  3.1 解析微信发来的请求

    微信服务器发来的请求消息都被封装在request对象中,可以从request对象中将请求参数取出来。通常是用request的getParament()方法获取请求中的参数,而在这里需要使用request对象的getInputStream()方法。通过getInputStream()方法获得输入流,再使用Dome4j读取输入流并解析XML格式的请求,最后将参数放入HashMap中。这样在我们调用此方法时就能轻易的得到回复消息时需要的对应参数。

  

/**
         * 解析微信发来的请求(XML)
         *
         * @param request
         * @return Map<String, String>
         * @throws Exception
         */
        //@SuppressWarnings("unchecked")
public static HashMap<String, String> parseXML(HttpServletRequest request) throws Exception {
            // 将解析结果存储在HashMap中
            HashMap<String, String> map = new HashMap<String, String>();

            // 从request中取得输入流
            InputStream inputStream = request.getInputStream();
            // 读取输入流
            SAXReader reader = new SAXReader();
            Document document = reader.read(request.getInputStream());
            // 得到xml根元素
            Element root = document.getRootElement();

            recursiveParseXML(root,map);

            inputStream.close();
            inputStream = null;

            return map;
        }
private static void recursiveParseXML(Element root,HashMap<String, String> map){
            // 得到根元素的所有子节点
            List<Element> elementList = root.elements();
            //判断有没有子元素列表
            if(elementList.size() == 0){
                map.put(root.getName(), root.getText());
            }else{
                //遍历
                for (Element e : elementList){
                    recursiveParseXML(e,map);
                }
            }
        }

   3.2 回复消息封装成XML

    公众号服务器在接受并处理完消息后,需要返回特定格式的XML结构进行响应。这里我们使用的是XStream库。

  

/**
         * 扩展xstream使其支持CDATA
         */
        private static XStream xstream = new XStream(new XppDriver() {
            public HierarchicalStreamWriter createWriter(Writer out) {
                return new PrettyPrintWriter(out) {
                    // 对所有xml节点的转换都增加CDATA标记
                    boolean cdata = true;

                    //@SuppressWarnings("unchecked")
                    public void startNode(String name, Class clazz) {
                        super.startNode(name, clazz);
                    }

                    protected void writeText(QuickWriter writer, String text) {
                        if (cdata) {
                            writer.write("<![CDATA[");
                            writer.write(text);
                            writer.write("]]>");
                        } else {
                            writer.write(text);
                        }
                    }
                };
            }
        });
/**
         * 文本消息对象转换成xml
         *
         * @param textMessage 文本消息对象
         * @return xml
         */
        public static String messageToXML(TextMessage textMessage) {
            xstream.alias("xml", TextMessage.class);
            return xstream.toXML(textMessage);
        }

        /**
         * 图片消息对象转换成xml
         *
         * @param imageMessage 图片消息对象
         * @return xml
         */
        public static String messageToXML(ImageMessage imageMessage) {
            xstream.alias("xml", ImageMessage.class);
            return xstream.toXML(imageMessage);
        }
/**
         * 语音消息对象转换成xml
         *
         * @param voiceMessage 语音消息对象
         * @return xml
         */
        public static String messageToXML(VoiceMessage voiceMessage) {
            xstream.alias("xml", VoiceMessage.class);
            return xstream.toXML(voiceMessage);
        }

        /**
         * 视频消息对象转换成xml
         *
         * @param videoMessage 视频消息对象
         * @return xml
         */
        public static String messageToXML(VideoMessage videoMessage) {
            xstream.alias("xml", VideoMessage.class);
            return xstream.toXML(videoMessage);
        }

    完整代码:

package com.util;

import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.message.ImageMessage;
import com.message.TextMessage;
import com.message.VideoMessage;
import com.message.VoiceMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;

/**
 *
 * @author 黄路飞
 *
 * @data  2016年6月18日21:56:47
 */
public class MessageUtil {
    // 请求消息类型:文本
        public static final String REQ_MESSAGE_TYPE_TEXT = "text";
        // 请求消息类型:图片
        public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
        // 请求消息类型:语音
        public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
        // 请求消息类型:视频
        public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
        // 请求消息类型:地理位置
        public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
        // 请求消息类型:链接
        public static final String REQ_MESSAGE_TYPE_LINK = "link";

        // 请求消息类型:事件推送
        public static final String REQ_MESSAGE_TYPE_EVENT = "event";

        // 事件类型:subscribe(订阅)
        public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
        // 事件类型:unsubscribe(取消订阅)
        public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
        // 事件类型:scan(用户已关注时的扫描带参数二维码)
        public static final String EVENT_TYPE_SCAN = "scan";
        // 事件类型:LOCATION(上报地理位置)
        public static final String EVENT_TYPE_LOCATION = "LOCATION";
        // 事件类型:CLICK(自定义菜单)
        public static final String EVENT_TYPE_CLICK = "CLICK";

        // 响应消息类型:文本
        public static final String RESP_MESSAGE_TYPE_TEXT = "text";
        // 响应消息类型:图片
        public static final String RESP_MESSAGE_TYPE_IMAGE = "image";
        // 响应消息类型:语音
        public static final String RESP_MESSAGE_TYPE_VOICE = "voice";
        // 响应消息类型:视频
        public static final String RESP_MESSAGE_TYPE_VIDEO = "video";
        // 响应消息类型:音乐
        public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
        // 响应消息类型:图文
        public static final String RESP_MESSAGE_TYPE_NEWS = "news";

        /**
         * 解析微信发来的请求(XML)
         *
         * @param request
         * @return Map<String, String>
         * @throws Exception
         */
        //@SuppressWarnings("unchecked")
        public static HashMap<String, String> parseXML(HttpServletRequest request) throws Exception {
            // 将解析结果存储在HashMap中
            HashMap<String, String> map = new HashMap<String, String>();

            // 从request中取得输入流
            InputStream inputStream = request.getInputStream();
            // 读取输入流
            SAXReader reader = new SAXReader();
            Document document = reader.read(request.getInputStream());
            // 得到xml根元素
            Element root = document.getRootElement();

            recursiveParseXML(root,map);

            inputStream.close();
            inputStream = null;

            return map;
        }

        private static void recursiveParseXML(Element root,HashMap<String, String> map){
            // 得到根元素的所有子节点
            List<Element> elementList = root.elements();
            //判断有没有子元素列表
            if(elementList.size() == 0){
                map.put(root.getName(), root.getText());
            }else{
                //遍历
                for (Element e : elementList){
                    recursiveParseXML(e,map);
                }
            }
        }

        /**
         * 扩展xstream使其支持CDATA
         */
        private static XStream xstream = new XStream(new XppDriver() {
            public HierarchicalStreamWriter createWriter(Writer out) {
                return new PrettyPrintWriter(out) {
                    // 对所有xml节点的转换都增加CDATA标记
                    boolean cdata = true;

                    //@SuppressWarnings("unchecked")
                    public void startNode(String name, Class clazz) {
                        super.startNode(name, clazz);
                    }

                    protected void writeText(QuickWriter writer, String text) {
                        if (cdata) {
                            writer.write("<![CDATA[");
                            writer.write(text);
                            writer.write("]]>");
                        } else {
                            writer.write(text);
                        }
                    }
                };
            }
        });

        /**
         * 文本消息对象转换成xml
         *
         * @param textMessage 文本消息对象
         * @return xml
         */
        public static String messageToXML(TextMessage textMessage) {
            xstream.alias("xml", TextMessage.class);
            return xstream.toXML(textMessage);
        }

        /**
         * 图片消息对象转换成xml
         *
         * @param imageMessage 图片消息对象
         * @return xml
         */
        public static String messageToXML(ImageMessage imageMessage) {
            xstream.alias("xml", ImageMessage.class);
            return xstream.toXML(imageMessage);
        }

        /**
         * 语音消息对象转换成xml
         *
         * @param voiceMessage 语音消息对象
         * @return xml
         */
        public static String messageToXML(VoiceMessage voiceMessage) {
            xstream.alias("xml", VoiceMessage.class);
            return xstream.toXML(voiceMessage);
        }

        /**
         * 视频消息对象转换成xml
         *
         * @param videoMessage 视频消息对象
         * @return xml
         */
        public static String messageToXML(VideoMessage videoMessage) {
            xstream.alias("xml", VideoMessage.class);
            return xstream.toXML(videoMessage);
        }

    }

时间: 2024-11-05 06:12:56

微信开发03----------XML解析与封装的相关文章

微信开发02----------消息结构的封装

?公众号服务器在接收到用户发送的请求消息后,可以通过返回特定的XML结构对消息进行响应 http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html 2.1 响应消息基类编写 1) 接收方帐号(收到的OpenID)  ToUserName 2) 开发者微信号(OpenID) FromUserName 3) 消息创建时间 (整型new Date().getTime()) CreateTime 4) 消息类型(text/mu

XML详解:第三部分 XML解析

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4290918.html XML解析... 72 使用DOM解析XML. 73 DOM树中的节点类型... 75 文档节点Document75 元素节点Element77 文本节点Text77 属性节点Attr78 NodeList接口...

java微信开发API解析(六)-综合运用(消息处理、自定义菜单响应处理、用户自动分组处理;包含源码)

java微信开发API解析(六) 全局说明 * 详细说明请参考前两篇文章. 本文说明 * 本文主要是对前面学习的知识进行综合整合. * 我们对需要的bean.工具类.xml.file进行必要的包装. * 我们构建一个可以直接使用的Java微信应用. * 文后包含该部分效果的测试微信公众号 * 文后包含构建好的源码供下载 bean的构建 public class Access_token,获取Access_token对应的bean. private String access_token; pri

iOS网络编程开发—JSON解析与XML解析

一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号 要想从

Android中微信抢红包插件原理解析和开发实现

一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了.或许是网络的原因,而且这个也是最大的原因.但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因.那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们

iOS开发之网络数据解析(二)--XML解析简介

前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件 2.IOS中XML解析方案有很多种: 2-1.第三方框架: libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX解析 GDataXML:DOM方式解析,由Google开发,基于libxml2 2-2.苹果原生 NSXMLParser:SAX方式解析,使用简单

java微信开发API解析(五)-用户管理

java微信开发API解析(五)-用户管理 全局说明 * 详细说明请参考前两篇文章. 本文说明 *本文分为五部分: * 工具类MyHttpUtils的封装 * 用户分组管理文档的简单阅读解析 * 分组bean的构建以及各种分组管理的实现源码 * 用户管理的应用场景 * 测试的微信号二维码 * 本文只分析用户管理的用户分组管理部分,其它都大同小异,不再分析处理.如需要,请留言. * 以后原理分析会越来越简洁,具体原理分析请查看以前文章. * 下一篇文章会对于用户普通消息.自定义菜单消息.自动完成用

Java反射机制实现微信公众平台XML数据解析

在做微信公众平台开发时,接收消息中有很多种类型的xml消息,比如"文本消息""图片消息""语音消息""视频消息""链接消息""地理位置消息"等等,最初在开发时针对每一种数据格式写了一个实体类,单独做解析,当然这样写的好处是层次分明.但经过尝试之后,用一个统一的实体类消息做处理,更加高效,当然,里面最核心的就是在遍历xml数据时,通过反射的机制动态调用set方法: 1.ReceiveXml

解析服务器端回传 XML 文件并封装为对象

起因 项目的上游数据对接方通过XML文件与主体项目进行通信,获取其XML的方法为通过HTTP的GET请求返回XML文件,之前还未遇到过这种传递方式,就稍微查了一下资料,写了一个出来,如果你也有类似的需求,可供参考. 正文 整个"接收-存储-查询-赋值"由两个模块组成,即"接收-存储"与"查询-赋值",配合一个用于封装的实体类与一个提高复用性的"Date-String"转换工具类. 整体的思路很简单,首先用java的"

微信开发中json与xml数据处理

写在前面的话:微信开发中,许多信息是通过json与xml格式来进行通信的,下面写一小总结. =====正文开始====== 一.json数据处理:json_decode 1.假设接收的json数据如下: $json='{"access_token":"o6_bmjrPTlm6_2sgVt7hMZOPfL2M","expires_in":7200}'; 2.通过json_decode($json),将字符串的json数据转化为PHP对象的形式: $