版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gh670011677/article/details/78030807
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道。所有的接口请求、应答都是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>");
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();
/**
* 将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方法
- }
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();
- }
- }
- }
- }
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);//<span style="font-family: Arial, Helvetica, sans-serif;">将XML报文中的标签,全部转化为大写</span>
- 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());
- }
- }
- }
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报文中的标签,全部转化为大写
* @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。
- 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>");
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();
/**
* 将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方法
- }
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();
- }
- }
- }
- }
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);//<span style="font-family: Arial, Helvetica, sans-serif;">将XML报文中的标签,全部转化为大写</span>
- 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());
- }
- }
- }
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报文中的标签,全部转化为大写
* @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格式报文时,由于对方返回的报文的标签有小写的,结果解析出错,所以在里面做了个处理,将标签全部转化为大写。