微信回调数据处理 (xml --> map)

由于工作上需要对接微信的支付接口,不过我对接的是华阳的接口,大部分都是以json数据传输的了(华阳中间对xml文件进行了转换)


但是支付之后回调的通知华阳并没有处理,我接收到的数据还是xml文件格式的,现在做java的大部分都是以json为主,说真的,个人很反感xml文件格式的数据传输


不过要做回调,也没办法,只能想办法去转换,获取数据,网上有很多关于xml文件转换的工具类,不过我不想使用,我想用jdk自带的API来完成这个转换。自然


而然的我们就会想到正则表达式,这家伙在把数据格式化处理起了很大的作用,学程序的应该都知道这个东西,好了,开始我要做的工作


原始的数据是


<xml><appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type></xml>


第一步是先去掉  前后的 xml 标签,因为不需要用到, 正则表达式是    </?xml>       ? 问号有两个功能,  1,是表示前面的字符串出现0或1次    2是开启懒惰匹配模式

在这里即表示匹配  </xml> 其中 / 字符有或没有都会匹配得到


<appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type>


剩下的就以代码给出来吧,写太多文件估计也没人爱看


package com.project.test;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test7 {

	public static void main(String[] args) {
		
		String xmlString = "<xml>"
				         + "<appid><![CDATA[wx2421b1c4370ec43b]]></appid>"
				         + "<attach><![CDATA[支付测试]]></attach>"
				         + "<bank_type><![CDATA[CFT]]></bank_type>"
				         + "<fee_type><![CDATA[CNY]]></fee_type>"
				         + "<total_fee>1</total_fee>"
				         + "</xml>";
		//去掉前后的xml标签
		xmlString = xmlString.replaceAll("</?xml>", "");
		System.out.println(xmlString);
		//匹配一段一段这样的数据   <attach><![CDATA[支付测试]]></attach>
		Pattern pattern = Pattern.compile("<.*?/.*?>");
		Matcher matcher = pattern.matcher(xmlString);
		//配置是否包含<![CDATA[CNY]]> CDATA 包裹的数据
		Pattern pattern2 = Pattern.compile("!.*]");
		Map<String, String> map = new HashMap<>();
		while(matcher.find()) {
			//获取键
			String key = matcher.group().replaceAll(".*/", "");
			key = key.substring(0, key.length() - 1);
			Matcher matcher2 = pattern2.matcher(matcher.group());
			String value = matcher.group().replaceAll("</?.*?>", "");
			//获取值
			if(matcher2.find() && !value.equals("DATA")) {
				value = matcher2.group().replaceAll("!.*\\[", "");
				value = value.substring(0, value.length() - 2);
			} 
			map.put(key, value);
		}
		System.out.println(map);
	}
}



主要就是要了解正则表达式的懒惰匹配模式用法,


   ? 问号有两个功能,  1,是表示前面的字符串出现0或1次    2是开启懒惰匹配模式

  
举个例子吧,比如现在有字符串   <zxc><ldh><hzh>

如果正则写成    <.*>   那就只会匹配到一个符合要求的,因为正则默认是开启贪婪模式的,有多少就匹配多少

如果你写成     <.*?>    会匹配到3个符合条件的    这里的 ? 就是开启了懒惰模式(对?后面的字符进行最短距离匹配)

大概就是这样,具体的百度一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值