xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道。所有的接口请求、应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下。
拼接xml格式报文。
从页面表单提交和配置文件中读取出参数,或用实体类接收的页面传来的参数。建立map对象,用put()方法把参数添加进去。然后遍历map,将map转换成xml。
-
StringBuffer soapResultData = new StringBuffer();
-
//xml声明
-
soapResultData.append("<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><MSG_HEAD>");
-
//请求头
-
soapResultData.append(requesttoxml(msgHead));
-
soapResultData.append("</MSG_HEAD><MSG_BODY>");
-
//请求体
-
soapResultData.append(requesttoxml(resmap));
-
soapResultData.append("</MSG_BODY></ROOT>");
-
/**
-
* 将map转化为XML格式的字符串
-
* @param resmap
-
* @return
-
*/
-
public static String requesttoxml(Map<String, String> resmap){
-
StringBuffer soapResultData = new StringBuffer();
-
for(String key : resmap.keySet()){
-
soapResultData.append("<");
-
soapResultData.append(key);
-
soapResultData.append(">");
-
soapResultData.append(resmap.get(key));
-
soapResultData.append("</");
-
soapResultData.append(key);
-
soapResultData.append(">");
-
}
-
return soapResultData.toString();
-
}
将接收到的xml格式报文,转换成实体类。
-
package com.ustcsoft.business.model;
-
-
import java.io.Serializable;
-
-
import org.apache.commons.digester3.annotations.rules.BeanPropertySetter;
-
import org.apache.commons.digester3.annotations.rules.ObjectCreate;
-
-
@ObjectCreate(pattern = "ROOT/MSG_HEAD")
-
public class ResponseMsgHead implements Serializable {
-
/**
-
*
-
*/
-
private static final long serialVersionUID = -2793215313546940251L;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/TRAN_CODE")
-
private String TRAN_CODE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/PARTNER_CODE")
-
private String PARTNER_CODE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/REQUEST_SERIAL")
-
private String REQUEST_SERIAL;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_DATE")
-
private String RESPONSE_DATE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_TIMESTAMP")
-
private String RESPONSE_TIMESTAMP;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_CODE")
-
private String RESULT_CODE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_MESSAGE")
-
private String RESULT_MESSAGE;
-
//get set 省略,不贴在这儿,自己使用时别忘了生成个set和get方法
-
}
-
import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
-
-
import java.io.StringReader;
-
import java.text.SimpleDateFormat;
-
import java.util.HashMap;
-
import java.util.Map;
-
import java.util.TreeMap;
-
-
import org.apache.commons.digester3.Digester;
-
import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
-
import org.apache.log4j.Logger;
-
-
import com.ustcsoft.business.model.CreditPayResponseBody;;
-
import com.ustcsoft.business.model.ResponseMsgHead;
-
import com.ustcsoft.framework.util.HTTPUtil;
-
import com.ustcsoft.framework.util.XMlUtil;
-
-
public class PayService {
-
private final Map<Class<?>, FromAnnotationsRuleModule> xmlAnnotationModule = new HashMap<Class<?>, FromAnnotationsRuleModule>();
-
private static final Logger logger=Logger.getLogger(PayService.class);
-
-
public PayService() {
-
xmlAnnotationModule.put(ResponseMsgHead.class,
-
new FromAnnotationsRuleModule() {
-
@Override
-
protected void configureRules() {
-
bindRulesFrom(ResponseMsgHead.class);
-
}
-
});
-
xmlAnnotationModule.put(CreditPayResponseBody.class,
-
new FromAnnotationsRuleModule() {
-
@Override
-
protected void configureRules() {
-
bindRulesFrom(CreditPayResponseBody.class);
-
}
-
});
-
}
-
-
//中间业务代码省略……
-
-
public <T> T parseXml(String xml, Class<T> clazz) throws Exception {
-
StringReader sr = null;
-
try {
-
Digester digester = newLoader(xmlAnnotationModule.get(clazz)).newDigester();
-
sr = new StringReader(xml);
-
T pi = digester.parse(sr);
-
digester.clear();
-
return pi;
-
} finally {
-
if (sr != null) {
-
sr.close();
-
}
-
}
-
}
-
}
-
logger.info("统一下单接口请求报文:"+requestxml);
-
String resultxml = HTTPUtil.postByHttps(url, requestxml,"GBK");
-
logger.info("统一下单接口返回报文:"+resultxml);
-
if(resultxml != null){
-
resultxml = XMlUtil.xmltoUpperCase(resultxml);//将XML报文中的标签,全部转化为大写
-
ResponseMsgHead head = parseXml(resultxml, ResponseMsgHead.class);
-
CreditPayResponseBody body = parseXml(resultxml, CreditPayResponseBody.class);
-
if (null != head) {
-
if(head.getRESULT_CODE().equals("000000")){
-
logger.info("下单成功");
-
logger.info("返回参数:sub_mch_id="+body.getSUB_MCH_ID()+",total_fee="+body.getTOTAL_FEE()+",out_trade_no="+body.getOUT_TRADE_NO());
-
return body;
-
}else{
-
logger.info("下单失败,错误码:"+head.getRESULT_CODE()+",错误信息:"+head.getRESULT_MESSAGE());
-
}
-
}
-
}
-
/**
-
* 将XML报文中的标签,全部转化为大写
-
* @param xmlMessage
-
* @return
-
*/
-
public static String xmltoUpperCase(String xmlMessage) {
-
Pattern pattern = Pattern.compile("<.+?>");
-
String xml = xmlMessage.split(">")[0];
-
String xml0 = xmlMessage.substring(0, xml.length()+1);
-
String xml1 = xmlMessage.substring(xml.length()+1);
-
StringBuilder res = new StringBuilder();
-
int lastIdx = 0;
-
Matcher matchr = pattern.matcher(xml1);
-
while (matchr.find()) {
-
String str = matchr.group();
-
res.append(xml1.substring(lastIdx, matchr.start()));
-
res.append(str.toUpperCase());
-
lastIdx = matchr.end();
-
}
-
res.append(xml1.substring(lastIdx));
-
String result = xml0 + res.toString();
-
return result;
-
}
以上就是拼接xml格式报文和解析xml格式报文。需要注意的是,在解析xml格式报文时,由于对方返回的报文的标签有小写的,结果解析出错,所以在里面做了个处理,将标签全部转化为大写。
xml格式报文的拼装,和解析成实体类的更多相关文章
- 自动将String类型的XML解析成实体类
package com.mooc.freemarker2dto; public class BaseDto { } package com.mooc.freemarker2dto; public cl ...
- IntelliJ IDEA 通过GsonFormat插件将JSONObject格式的String 解析成实体
GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...
- GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高。
GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...
- IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体
前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- WebApi系列~FromUri参数自动解析成实体的要求
回到目录 关于webapi我之前写了一些文章,大家可以根据目录去浏览,今天要说的是个怪问题,也是被我忽略的一个问题,当你的Url参数需要被Api自动解析成实体的属性,实事上是要有条件的,不是所以属性都 ...
- 复杂xml格式报文和实体类之间的转化
pom.xml中引入如下依赖: <dependency> <groupId>org.eclipse.persistence</groupId> <artifa ...
- ajax交互数据简单拼装,数组成字符串
json2Form:function(json) { var str = ""; for(var p in json){ // 判断对象是否为数组 if(typeof json[p ...
- SpringCloud中接收application/json格式的post请求参数并转化为实体类
@CrossOrigin(allowCredentials="true", allowedHeaders="*", methods={RequestMethod ...
随机推荐
- unity 5.6.1 Oculus手柄输入问题
unity文档中提到 轴的 ID 是5和6,但是测试后发现,ID是6和7,很坑 void Update () { if (Input.GetKeyDown(KeyCode.JoystickButton ...
- Linux学习总结(9)——Linux 新手必知必会的 10 条 Linux 基本命令
Linux 对我们的生活产生了巨大的冲击.至少你的安卓手机使用的就是 Linux 核心.尽管如此,在第一次开始使用 Linux 时你还是会感到难以下手.因为在 Linux 中,通常需要使用终端命令来取 ...
- HDFS文件系统上传时序图 PB级文件存储时序图
自己设计的时序图. 来自为知笔记(Wiz)
- vmware启动虚拟机报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine is stored is almost full. To continue, free an additional 1.4 GB of disk space.
报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine i ...
- Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上)
继上一篇Android系统源代码剖析(一)---Settings 接着来介绍一下设置中某个模块的源代码.本文依然是基于Android4.42源代码进行分析,分析一下蓝牙模块的实现.建议大致看一下关于S ...
- Ubuntu常见报错及解决方式汇总
作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...
- 开源计算机集群监控Ganglia应用视频
Ganglia源于Berkeley发起的一个开源集群监视项目,设计用于监测数上千节点的计算机集群.它包含gmond.gmetad以及一个Web前端.可以用来监控系统处理器 .内存.硬盘 I/O.网络流 ...
- [Chromium文档转载,第004章]Mojo Synchronous Calls
For Developers > Design Documents > Mojo > Synchronous Calls Think carefully before ...
- Huawei交换机VRP配置介绍
一.命令视图• 用户视图<Huawei>• 系统视图 [Huawei]• 接口视图 [Huawei-GigabitEthernet0/0/1]• 协议视图 [Huawei-rip-1]• ...
- angularjs 页面缓存及动态刷新解决方案
一.准备工作 框架:angularjs ui组件库:ionic1 二.页面缓存cache 路由设置cache参数,true为缓存,false为不缓存,代码如下: angular.module('app ...