xml格式报文的拼装,和解析成实体类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gh670011677/article/details/78030807

         我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道。所有的接口请求、应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下。

        拼接xml格式报文。

        从页面表单提交和配置文件中读取出参数,或用实体类接收的页面传来的参数。建立map对象,用put()方法把参数添加进去。然后遍历map,将map转换成xml。

  1. StringBuffer soapResultData = new StringBuffer();  
  2. //xml声明  
  3. soapResultData.append("<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><MSG_HEAD>");  
  4. //请求头  
  5. soapResultData.append(requesttoxml(msgHead));  
  6. soapResultData.append("</MSG_HEAD><MSG_BODY>");  
  7. //请求体  
  8. soapResultData.append(requesttoxml(resmap));  
  9. soapResultData.append("</MSG_BODY></ROOT>");  
  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>");

  1. /** 
  2. * 将map转化为XML格式的字符串 
  3. * @param resmap 
  4. * @return 
  5. */  
  6. public static String requesttoxml(Map<String, String> resmap){  
  7. StringBuffer soapResultData = new StringBuffer();  
  8. for(String key : resmap.keySet()){  
  9.     soapResultData.append("<");  
  10.     soapResultData.append(key);  
  11.     soapResultData.append(">");  
  12.     soapResultData.append(resmap.get(key));  
  13.     soapResultData.append("</");  
  14.     soapResultData.append(key);  
  15.     soapResultData.append(">");  
  16. }  
  17. return soapResultData.toString();  
  /**
	 * 将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格式报文,转换成实体类。

        

  1. package com.ustcsoft.business.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import org.apache.commons.digester3.annotations.rules.BeanPropertySetter;  
  6. import org.apache.commons.digester3.annotations.rules.ObjectCreate;  
  7.   
  8. @ObjectCreate(pattern = "ROOT/MSG_HEAD")  
  9. public class ResponseMsgHead implements Serializable {  
  10.     /** 
  11.      *  
  12.      */  
  13.     private static final long serialVersionUID = -2793215313546940251L;  
  14.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/TRAN_CODE")  
  15.     private String TRAN_CODE;  
  16.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/PARTNER_CODE")  
  17.     private String PARTNER_CODE;  
  18.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/REQUEST_SERIAL")  
  19.     private String REQUEST_SERIAL;  
  20.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_DATE")  
  21.     private String RESPONSE_DATE;  
  22.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_TIMESTAMP")  
  23.     private String RESPONSE_TIMESTAMP;  
  24.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_CODE")  
  25.     private String RESULT_CODE;  
  26.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_MESSAGE")  
  27.     private String RESULT_MESSAGE;  
  28.     //get set 省略,不贴在这儿,自己使用时别忘了生成个set和get方法  
  29. }  
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方法
}

  1. import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;  
  2.   
  3. import java.io.StringReader;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import java.util.TreeMap;  
  8.   
  9. import org.apache.commons.digester3.Digester;  
  10. import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;  
  11. import org.apache.log4j.Logger;  
  12.   
  13. import com.ustcsoft.business.model.CreditPayResponseBody;;  
  14. import com.ustcsoft.business.model.ResponseMsgHead;  
  15. import com.ustcsoft.framework.util.HTTPUtil;  
  16. import com.ustcsoft.framework.util.XMlUtil;  
  17.   
  18. public class PayService {  
  19.     private final Map<Class<?>, FromAnnotationsRuleModule> xmlAnnotationModule = new HashMap<Class<?>, FromAnnotationsRuleModule>();  
  20.     private static final Logger logger=Logger.getLogger(PayService.class);  
  21.       
  22.     public PayService() {  
  23.         xmlAnnotationModule.put(ResponseMsgHead.class,  
  24.                 new FromAnnotationsRuleModule() {  
  25.                     @Override  
  26.                     protected void configureRules() {  
  27.                         bindRulesFrom(ResponseMsgHead.class);  
  28.                     }  
  29.                 });  
  30.         xmlAnnotationModule.put(CreditPayResponseBody.class,  
  31.                 new FromAnnotationsRuleModule() {  
  32.                     @Override  
  33.                     protected void configureRules() {  
  34.                         bindRulesFrom(CreditPayResponseBody.class);  
  35.                     }  
  36.                 });  
  37.     }  
  38.       
  39.     //中间业务代码省略……  
  40.               
  41.     public <T> T parseXml(String xml, Class<T> clazz) throws Exception {  
  42.         StringReader sr = null;  
  43.         try {  
  44.             Digester digester = newLoader(xmlAnnotationModule.get(clazz)).newDigester();  
  45.             sr = new StringReader(xml);  
  46.             T pi = digester.parse(sr);  
  47.             digester.clear();  
  48.             return pi;  
  49.         } finally {  
  50.             if (sr != null) {  
  51.                 sr.close();  
  52.             }  
  53.         }  
  54.     }  
  55. }  
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();
			}
		}
	}
}
  1.  logger.info("统一下单接口请求报文:"+requestxml);  
  2. String resultxml = HTTPUtil.postByHttps(url, requestxml,"GBK");  
  3. logger.info("统一下单接口返回报文:"+resultxml);  
  4. if(resultxml != null){  
  5.     resultxml = XMlUtil.xmltoUpperCase(resultxml);//<span style="font-family: Arial, Helvetica, sans-serif;">将XML报文中的标签,全部转化为大写</span>  
  6.     ResponseMsgHead head = parseXml(resultxml, ResponseMsgHead.class);  
  7.     CreditPayResponseBody body = parseXml(resultxml, CreditPayResponseBody.class);  
  8.     if (null != head) {  
  9.         if(head.getRESULT_CODE().equals("000000")){  
  10.             logger.info("下单成功");  
  11.             logger.info("返回参数:sub_mch_id="+body.getSUB_MCH_ID()+",total_fee="+body.getTOTAL_FEE()+",out_trade_no="+body.getOUT_TRADE_NO());  
  12.             return body;  
  13.         }else{  
  14.             logger.info("下单失败,错误码:"+head.getRESULT_CODE()+",错误信息:"+head.getRESULT_MESSAGE());  
  15.         }  
  16.     }  
  17. }  
    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());
					}
				}
			}

  1. /** 
  2. * 将XML报文中的标签,全部转化为大写 
  3. * @param xmlMessage 
  4. * @return 
  5. */  
  6. public static String xmltoUpperCase(String xmlMessage) {  
  7.       Pattern pattern = Pattern.compile("<.+?>");  
  8.       String xml = xmlMessage.split(">")[0];  
  9.       String xml0 = xmlMessage.substring(0, xml.length()+1);  
  10.       String xml1 = xmlMessage.substring(xml.length()+1);  
  11.       StringBuilder res = new StringBuilder();  
  12.       int lastIdx = 0;  
  13.       Matcher matchr = pattern.matcher(xml1);  
  14.       while (matchr.find()) {  
  15.           String str = matchr.group();  
  16.           res.append(xml1.substring(lastIdx, matchr.start()));  
  17.           res.append(str.toUpperCase());  
  18.           lastIdx = matchr.end();  
  19.       }  
  20.       res.append(xml1.substring(lastIdx));  
  21.       String result = xml0 + res.toString();  
  22. return result;  
  23.   }  
  /**
	 * 将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格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下。

        拼接xml格式报文。

        从页面表单提交和配置文件中读取出参数,或用实体类接收的页面传来的参数。建立map对象,用put()方法把参数添加进去。然后遍历map,将map转换成xml。

  1. StringBuffer soapResultData = new StringBuffer();  
  2. //xml声明  
  3. soapResultData.append("<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><MSG_HEAD>");  
  4. //请求头  
  5. soapResultData.append(requesttoxml(msgHead));  
  6. soapResultData.append("</MSG_HEAD><MSG_BODY>");  
  7. //请求体  
  8. soapResultData.append(requesttoxml(resmap));  
  9. soapResultData.append("</MSG_BODY></ROOT>");  
  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>");

  1. /** 
  2. * 将map转化为XML格式的字符串 
  3. * @param resmap 
  4. * @return 
  5. */  
  6. public static String requesttoxml(Map<String, String> resmap){  
  7. StringBuffer soapResultData = new StringBuffer();  
  8. for(String key : resmap.keySet()){  
  9.     soapResultData.append("<");  
  10.     soapResultData.append(key);  
  11.     soapResultData.append(">");  
  12.     soapResultData.append(resmap.get(key));  
  13.     soapResultData.append("</");  
  14.     soapResultData.append(key);  
  15.     soapResultData.append(">");  
  16. }  
  17. return soapResultData.toString();  
  /**
	 * 将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格式报文,转换成实体类。

        

  1. package com.ustcsoft.business.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import org.apache.commons.digester3.annotations.rules.BeanPropertySetter;  
  6. import org.apache.commons.digester3.annotations.rules.ObjectCreate;  
  7.   
  8. @ObjectCreate(pattern = "ROOT/MSG_HEAD")  
  9. public class ResponseMsgHead implements Serializable {  
  10.     /** 
  11.      *  
  12.      */  
  13.     private static final long serialVersionUID = -2793215313546940251L;  
  14.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/TRAN_CODE")  
  15.     private String TRAN_CODE;  
  16.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/PARTNER_CODE")  
  17.     private String PARTNER_CODE;  
  18.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/REQUEST_SERIAL")  
  19.     private String REQUEST_SERIAL;  
  20.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_DATE")  
  21.     private String RESPONSE_DATE;  
  22.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_TIMESTAMP")  
  23.     private String RESPONSE_TIMESTAMP;  
  24.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_CODE")  
  25.     private String RESULT_CODE;  
  26.     @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_MESSAGE")  
  27.     private String RESULT_MESSAGE;  
  28.     //get set 省略,不贴在这儿,自己使用时别忘了生成个set和get方法  
  29. }  
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方法
}

  1. import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;  
  2.   
  3. import java.io.StringReader;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import java.util.TreeMap;  
  8.   
  9. import org.apache.commons.digester3.Digester;  
  10. import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;  
  11. import org.apache.log4j.Logger;  
  12.   
  13. import com.ustcsoft.business.model.CreditPayResponseBody;;  
  14. import com.ustcsoft.business.model.ResponseMsgHead;  
  15. import com.ustcsoft.framework.util.HTTPUtil;  
  16. import com.ustcsoft.framework.util.XMlUtil;  
  17.   
  18. public class PayService {  
  19.     private final Map<Class<?>, FromAnnotationsRuleModule> xmlAnnotationModule = new HashMap<Class<?>, FromAnnotationsRuleModule>();  
  20.     private static final Logger logger=Logger.getLogger(PayService.class);  
  21.       
  22.     public PayService() {  
  23.         xmlAnnotationModule.put(ResponseMsgHead.class,  
  24.                 new FromAnnotationsRuleModule() {  
  25.                     @Override  
  26.                     protected void configureRules() {  
  27.                         bindRulesFrom(ResponseMsgHead.class);  
  28.                     }  
  29.                 });  
  30.         xmlAnnotationModule.put(CreditPayResponseBody.class,  
  31.                 new FromAnnotationsRuleModule() {  
  32.                     @Override  
  33.                     protected void configureRules() {  
  34.                         bindRulesFrom(CreditPayResponseBody.class);  
  35.                     }  
  36.                 });  
  37.     }  
  38.       
  39.     //中间业务代码省略……  
  40.               
  41.     public <T> T parseXml(String xml, Class<T> clazz) throws Exception {  
  42.         StringReader sr = null;  
  43.         try {  
  44.             Digester digester = newLoader(xmlAnnotationModule.get(clazz)).newDigester();  
  45.             sr = new StringReader(xml);  
  46.             T pi = digester.parse(sr);  
  47.             digester.clear();  
  48.             return pi;  
  49.         } finally {  
  50.             if (sr != null) {  
  51.                 sr.close();  
  52.             }  
  53.         }  
  54.     }  
  55. }  
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();
			}
		}
	}
}
  1.  logger.info("统一下单接口请求报文:"+requestxml);  
  2. String resultxml = HTTPUtil.postByHttps(url, requestxml,"GBK");  
  3. logger.info("统一下单接口返回报文:"+resultxml);  
  4. if(resultxml != null){  
  5.     resultxml = XMlUtil.xmltoUpperCase(resultxml);//<span style="font-family: Arial, Helvetica, sans-serif;">将XML报文中的标签,全部转化为大写</span>  
  6.     ResponseMsgHead head = parseXml(resultxml, ResponseMsgHead.class);  
  7.     CreditPayResponseBody body = parseXml(resultxml, CreditPayResponseBody.class);  
  8.     if (null != head) {  
  9.         if(head.getRESULT_CODE().equals("000000")){  
  10.             logger.info("下单成功");  
  11.             logger.info("返回参数:sub_mch_id="+body.getSUB_MCH_ID()+",total_fee="+body.getTOTAL_FEE()+",out_trade_no="+body.getOUT_TRADE_NO());  
  12.             return body;  
  13.         }else{  
  14.             logger.info("下单失败,错误码:"+head.getRESULT_CODE()+",错误信息:"+head.getRESULT_MESSAGE());  
  15.         }  
  16.     }  
  17. }  
    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());
					}
				}
			}

  1. /** 
  2. * 将XML报文中的标签,全部转化为大写 
  3. * @param xmlMessage 
  4. * @return 
  5. */  
  6. public static String xmltoUpperCase(String xmlMessage) {  
  7.       Pattern pattern = Pattern.compile("<.+?>");  
  8.       String xml = xmlMessage.split(">")[0];  
  9.       String xml0 = xmlMessage.substring(0, xml.length()+1);  
  10.       String xml1 = xmlMessage.substring(xml.length()+1);  
  11.       StringBuilder res = new StringBuilder();  
  12.       int lastIdx = 0;  
  13.       Matcher matchr = pattern.matcher(xml1);  
  14.       while (matchr.find()) {  
  15.           String str = matchr.group();  
  16.           res.append(xml1.substring(lastIdx, matchr.start()));  
  17.           res.append(str.toUpperCase());  
  18.           lastIdx = matchr.end();  
  19.       }  
  20.       res.append(xml1.substring(lastIdx));  
  21.       String result = xml0 + res.toString();  
  22. return result;  
  23.   }  
  /**
	 * 将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格式报文时,由于对方返回的报文的标签有小写的,结果解析出错,所以在里面做了个处理,将标签全部转化为大写。

        

猜你喜欢

转载自blog.csdn.net/gh670011677/article/details/78030807