由于工作上需要对接微信的支付接口,不过我对接的是华阳的接口,大部分都是以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);
}
}
主要就是要了解正则表达式的懒惰匹配模式用法,
大概就是这样,具体的百度一下