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

来源:互联网 发布:sql删除重复的数据 编辑:程序博客网 时间:2024/06/04 18:38

由于工作上需要对接微信的支付接口,不过我对接的是华阳的接口,大部分都是以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个符合条件的    这里的 ? 就是开启了懒惰模式(对?后面的字符进行最短距离匹配)

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