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格式报文时,由于对方返回的报文的标签有小写的,结果解析出错,所以在里面做了个处理,将标签全部转化为大写。

        

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Java 接收 XML 格式的参数并解析 JSONObject 和实体,你可以使用一些第三方库来完。以下是一个示例代码: ```java import org.json.JSONObject; import org.json.XML; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.StringReader; public class XmlParser { public static JSONObject parseXmlToJson(String xml) { int PRETTY_PRINT_INDENT_FACTOR = 4; JSONObject jsonObject = XML.toJSONObject(xml); String jsonOutput = jsonObject.toString(PRETTY_PRINT_INDENT_FACTOR); return new JSONObject(jsonOutput); } public static <T> T parseXmlToEntity(String xml, Class<T> entityClass) throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(entityClass); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); StringReader reader = new StringReader(xml); return (T) unmarshaller.unmarshal(reader); } } ``` 上述代码使用了两个库,一个是 `org.json.XML` 来将 XML 解析为 JSONObject,另一个是 Java 自带的 JAXB(Java Architecture for XML Binding)库来将 XML 解析为实体对象。 在 `parseXmlToJson` 方法,首先将 XML 字符串转换为 JSONObject 对象,然后将其格式化为要求的输出格式。 在 `parseXmlToEntity` 方法,首先创建一个 JAXBContext 对象,然后创建一个 Unmarshaller 对象,接着使用 StringReader 将 XML 字符串转换为 Reader 对象,最后使用 unmarshaller 对象将 Reader 转换为实体对象。 你可以根据自己的需求调用这两个方法来解析 XML 参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持是一种态度

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值