自定义报文格式

 1 <?xml version="1.0" encoding="gbk"?>
 2 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 3     <soap:Header>
 4         <out:system xmlns:out="http://www.ylzinfo.com/"></out:system>
 5     </soap:Header>
 6     <soap:Body>
 7         <out:business xmlns:out="http://www.ylzinfo.com/">
 8             <result showtype="1" />
 9             <resultset name="retrieve">
10                 <row resultCode="0" resultMessage="请求成功" resultBody="null" />
11                 <row cloudPath="www.baidu.com" fileType="txt" fileTradeNo="12345678" fileDesc="测试" />
12             </resultset>
13         </out:business>
14         <soap:Fault>
15             <faultcode>0</faultcode>
16             <faultstring>请求成功</faultstring>
17             <channelNo>1400000001</channelNo>
18             <signNo>1111111111111111111</signNo>
19             <aac002>373738383927711231</aac002>
20             <aaz999>1234567890</aaz999>
21             <aaz333>12312312312</aaz333>
22             <aae036>1578988937192</aae036>
23             <pageSize></pageSize>
24             <cPage></cPage>
25             <fileFlag>1</fileFlag>
26         </soap:Fault>
27     </soap:Body>
28 </soap:Envelope>
目标格式

测试类:

 1 import com.alibaba.fastjson.JSON;
 2 
 3 import com.socialsecurity.domain.ResultCode;
 4 import com.socialsecurity.domain.soap.FileDataBody;
 5 import com.socialsecurity.domain.soap.ResultDataBody;
 6 import com.socialsecurity.domain.soap.SoapDatagram;
 7 import com.socialsecurity.util.EsbUtil;
 8 import com.socialsecurity.util.SoapUtil;
 9 
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Map;
13 
14 
15 public class DatagramTest {
16 
17     public static void main(String[] args) {
18         ResultDataBody outData = new ResultDataBody(ResultCode.BUSINESS_SUCCESS, "请求成功");
19         FileDataBody fileDataBody = new FileDataBody();
20         fileDataBody.setCloudPath("www.baidu.com");
21         fileDataBody.setFileType("txt");
22         fileDataBody.setFileTradeNo("12345678");
23         fileDataBody.setFileDesc("测试");
24 
25         List files = new ArrayList<>();
26         files.add(fileDataBody);
27 
28         SoapDatagram datagram = new SoapDatagram.Builder(ResultCode.BUSINESS_SUCCESS, "请求成功")
29                 .channelNo("1400000001")
30                 .signNo("1111111111111111111")
31                 .aac002("373738383927711231")
32                 .aaz333("12312312312")
33                 .aaz999("1234567890")
34                 .aae036("1578988937192")
35                 .outData(outData)
36                 .files(files)
37                 .build();
38 
39         String xml = SoapUtil.readerSoapXMlOut(datagram);
40         System.out.println(xml);
41 
42         Map map = EsbUtil.parseDataV2(xml);
43         System.out.println(JSON.toJSONString(map));
44     }
45 }
DatagramTest
 1 package com.socialsecurity.domain.soap;
 2 
 3 import java.io.Serializable;
 4 
 5 
 6  
 7 public class ResultDataBody implements Serializable {
 8 
 9 
10     /**
11      * 业务响应码
12      */
13     private String resultCode;
14 
15     /**
16      * 业务响应消息
17      */
18     private String resultMessage;
19 
20     /**
21      * 响应结果
22      */
23     private String resultBody;
24 
25 
26     public ResultDataBody(String resultCode, String resultMessage) {
27         this.resultCode = resultCode;
28         this.resultMessage = resultMessage;
29     }
30 
31     public ResultDataBody(String resultCode, String resultMessage, String resultBody) {
32         this.resultCode = resultCode;
33         this.resultMessage = resultMessage;
34         this.resultBody = resultBody;
35     }
36 
37     public String getResultCode() {
38         return resultCode;
39     }
40 
41     public void setResultCode(String resultCode) {
42         this.resultCode = resultCode;
43     }
44 
45     public String getResultMessage() {
46         return resultMessage;
47     }
48 
49     public void setResultMessage(String resultMessage) {
50         this.resultMessage = resultMessage;
51     }
52 
53     public String getResultBody() {
54         return resultBody;
55     }
56 
57     public void setResultBody(String resultBody) {
58         this.resultBody = resultBody;
59     }
60 }
ResultDataBody
 1 package com.socialsecurity.domain.soap;
 2 
 3 
 4 public class FileDataBody {
 5 
 6 
 7     /**
 8      * 云文件存储地址
 9      */
10     private String cloudPath;
11 
12     /**
13      * 文件类型
14      */
15     private String fileType;
16 
17     /**
18      * 文件编号
19      */
20     private String fileTradeNo;
21 
22     /**
23      * 文件描述
24      */
25     private String fileDesc;
26 
27     public FileDataBody() {
28     }
29 
30     public FileDataBody(String cloudPath, String fileType, String fileTradeNo, String fileDesc) {
31         this.cloudPath = cloudPath;
32         this.fileType = fileType;
33         this.fileTradeNo = fileTradeNo;
34         this.fileDesc = fileDesc;
35     }
36 
37     public String getCloudPath() {
38         return cloudPath;
39     }
40 
41     public void setCloudPath(String cloudPath) {
42         this.cloudPath = cloudPath;
43     }
44 
45     public String getFileType() {
46         return fileType;
47     }
48 
49     public void setFileType(String fileType) {
50         this.fileType = fileType;
51     }
52 
53     public String getFileTradeNo() {
54         return fileTradeNo;
55     }
56 
57     public void setFileTradeNo(String fileTradeNo) {
58         this.fileTradeNo = fileTradeNo;
59     }
60 
61     public String getFileDesc() {
62         return fileDesc;
63     }
64 
65     public void setFileDesc(String fileDesc) {
66         this.fileDesc = fileDesc;
67     }
68 }
FileDataBody
  1 package com.socialsecurity.domain.soap;
  2 
  3 import java.util.List;
  4 
  5 
  6 public class SoapDatagram {
  7 
  8     /**
  9      * 系统响应码
 10      */
 11     private String faultCode;
 12 
 13     /**
 14      * 系统响应消息
 15      */
 16     private String faultstring;
 17 
 18     /**
 19      * 渠道编号
 20      */
 21     private String channelNo;
 22 
 23     /**
 24      * 签发号
 25      */
 26     private String signNo;
 27 
 28     /**
 29      * 保障号码
 30      */
 31     private String aac002;
 32     /**
 33      * 流水号
 34      */
 35     private String aaz999;
 36     /**
 37      * XX编码
 38      */
 39     private String aaz333;
 40 
 41     /**
 42      * 时间戳
 43      */
 44     private String aae036;
 45 
 46     /**
 47      * 每页行数
 48      */
 49     private String pageSize;
 50     /**
 51      * 当前页
 52      */
 53     private String cPage;
 54 
 55     /**
 56      * 是否上传附件标识
 57      * 0无附件 1存在附件
 58      */
 59     private String fileFlag;
 60 
 61 
 62     /**
 63      * 出参数集
 64      */
 65     private ResultDataBody outdata;
 66 
 67     /**
 68      * 附件集
 69      */
 70     private List<FileDataBody> files;
 71 
 72     public SoapDatagram() {
 73     }
 74 
 75     private SoapDatagram(Builder builder) {
 76         this.faultCode = builder.faultCode;
 77         this.faultstring = builder.faultstring;
 78         this.channelNo = builder.channelNo;
 79         this.signNo = builder.signNo;
 80         this.aac002 = builder.aac002;
 81         this.aaz999 = builder.aaz999;
 82         this.aaz333 = builder.aaz333;
 83         this.aae036 = builder.aae036;
 84         this.pageSize = builder.pageSize;
 85         this.cPage = builder.cPage;
 86         this.fileFlag = builder.fileFlag;
 87         this.outdata = builder.outdata;
 88         this.files = builder.files;
 89     }
 90 
 91     public static class Builder {
 92         private String faultCode;
 93         private String faultstring;
 94         private String channelNo;
 95         private String signNo;
 96         private String aac002;
 97         private String aaz999;
 98         private String aaz333;
 99         private String aae036;
100         private String pageSize;
101         private String cPage;
102         private String fileFlag = "0";
103         private ResultDataBody outdata;
104         private List<FileDataBody> files;
105 
106         public Builder(String faultCode, String faultstring) {
107             this.faultCode = faultCode;
108             this.faultstring = faultstring;
109         }
110 
111 
112         public Builder channelNo(String channelNo) {
113             this.channelNo = channelNo;
114             return this;
115         }
116 
117         public Builder signNo(String signNo) {
118             this.signNo = signNo;
119             return this;
120         }
121 
122         public Builder aac002(String aac002) {
123             this.aac002 = aac002;
124             return this;
125         }
126 
127         public Builder aaz999(String aaz999) {
128             this.aaz999 = aaz999;
129             return this;
130         }
131 
132         public Builder aaz333(String aaz333) {
133             this.aaz333 = aaz333;
134             return this;
135         }
136 
137         public Builder aae036(String aae036) {
138             this.aae036 = aae036;
139             return this;
140         }
141 
142         public Builder pageHelper(String pageSize, String cPage) {
143             this.pageSize = pageSize;
144             this.cPage = cPage;
145             return this;
146         }
147 
148 
149         public Builder outData(ResultDataBody outdata) {
150             this.outdata = outdata;
151             return this;
152         }
153 
154         public Builder files(List<FileDataBody> files) {
155             if (files.size() > 0) this.fileFlag = "1";
156             this.files = files;
157             return this;
158         }
159 
160 
161         public SoapDatagram build() {
162             return new SoapDatagram(this);
163         }
164 
165     }
166 
167 
168     public String getFaultCode() {
169         return faultCode;
170     }
171 
172     public void setFaultCode(String faultCode) {
173         this.faultCode = faultCode;
174     }
175 
176     public String getFaultstring() {
177         return faultstring;
178     }
179 
180     public void setFaultstring(String faultstring) {
181         this.faultstring = faultstring;
182     }
183 
184     public String getChannelNo() {
185         return channelNo;
186     }
187 
188     public void setChannelNo(String channelNo) {
189         this.channelNo = channelNo;
190     }
191 
192     public String getSignNo() {
193         return signNo;
194     }
195 
196     public void setSignNo(String signNo) {
197         this.signNo = signNo;
198     }
199 
200     public String getAac002() {
201         return aac002;
202     }
203 
204     public void setAac002(String aac002) {
205         this.aac002 = aac002;
206     }
207 
208     public String getAaz999() {
209         return aaz999;
210     }
211 
212     public void setAaz999(String aaz999) {
213         this.aaz999 = aaz999;
214     }
215 
216     public String getAaz333() {
217         return aaz333;
218     }
219 
220     public void setAaz333(String aaz333) {
221         this.aaz333 = aaz333;
222     }
223 
224     public String getAae036() {
225         return aae036;
226     }
227 
228     public void setAae036(String aae036) {
229         this.aae036 = aae036;
230     }
231 
232     public String getPageSize() {
233         return pageSize;
234     }
235 
236     public void setPageSize(String pageSize) {
237         this.pageSize = pageSize;
238     }
239 
240     public String getcPage() {
241         return cPage;
242     }
243 
244     public void setcPage(String cPage) {
245         this.cPage = cPage;
246     }
247 
248     public String getFileFlag() {
249         return fileFlag;
250     }
251 
252     public void setFileFlag(String fileFlag) {
253         this.fileFlag = fileFlag;
254     }
255 
256     public ResultDataBody getOutdata() {
257         return outdata;
258     }
259 
260     public void setOutdata(ResultDataBody outdata) {
261         this.outdata = outdata;
262     }
263 
264     public List<FileDataBody> getFiles() {
265         return files;
266     }
267 
268     public void setFiles(List<FileDataBody> files) {
269         this.files = files;
270     }
271 }
SoapDatagram
  1 package com.socialsecurity.util;
  2 
  3 
  4 public  class SoapEnvelop {
  5 
  6     public static final String ENVELOP_END = "</soap:Envelope>";
  7 
  8     public static final String BODY_END = "</soap:Body>";
  9 
 10     public static final String BODY_START = "<soap:Body>";
 11 
 12     public static final String BUSINESS_START="<out:business xmlns:out="http://www.ylzinfo.com/">";
 13     
 14     public static final String BUSINESS_END="</out:business>";
 15     
 16     public static final String HEAD_END = "</out:system></soap:Header>";
 17 
 18     public static final String HEAD_START = "<soap:Header><out:system xmlns:out="http://www.ylzinfo.com/">";
 19 
 20     public static final String ENVELOP_START = "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">";
 21 
 22     public static final String XML_PI = "<?xml version="1.0" encoding="GBK"?>";
 23     
 24     public static final String  TotalNum_Start= "<result totalnum="";
 25     public static final String  TotalNum_End=  "" />";
 26     
 27     public static final String  CPAGE_Start= "<result cpage="";
 28     public static final String  CPAGE_End=  "" />";
 29     
 30     public static final String  PAGES_Start= "<result pages="";
 31     public static final String  PAGES_End=  "" />";
 32     
 33     public static final String  ROWCOUNT_Start= "<result rowCount="";
 34     public static final String  ROWCOUNT_End=  "" />";
 35     
 36     public static final String  Single_Row= "<result showtype="1"/>";
 37     
 38     public static final String  Show_Type_Result= "</result>";
 39     
 40     public static final String  ServiceID_Start= "<result serviceId="";
 41     public static final String  ServiceID_End= ""/>";
 42     
 43     public static final String  Multilateral_Row= "<result showtype="2"/>";
 44     
 45     public static final String  Structs_START = "<resultset name="structs">";
 46     public static final String  Structs_END = "</resultset>";
 47     
 48     public static final String  Retrieve_START = "<resultset name="retrieve">";
 49     public static final String  Retrieve_END = "</resultset>";
 50     
 51     public static final String  Message_START = "<resultset name="retrieve" information="";
 52     public static final String  Message_R= "" >";
 53     public static final String  Message_End = "</resultset>";
 54     public static final String  Single= "1";
 55     
 56     public static final String  Multilateral= "2";
 57     
 58     public static final String  FAULT_START="<soap:Fault>";
 59     public static final String  FAULT_END="</soap:Fault>";
 60     
 61     public static final String  FAULT_CODE_START="<faultcode>";
 62     public static final String  FAULT_CODE_END="</faultcode>";
 63     
 64     public static final String  FAULT_STR_START="<faultstring>";
 65     public static final String  FAULT_STR_END="</faultstring>";
 66     
 67     
 68     public static final String ERROR_MSG_START="<error msg="";
 69     public static final String ERROR_MSG_END="" />";
 70     public static final String REVERSAL_RESULT_START="<result>";
 71     public static final String REVERSAL_RESULT_END="</result>";
 72     public static final String REVERSAL_SUCCESS_START="<success>";
 73     public static final String REVERSAL_SUCCESS_END="</success>";
 74     public static final String REVERSAL_URL_START="<url>";
 75     public static final String REVERSAL_URL_END="</url>";
 76     public static final String REVERSAL_SQL_START="<sql>";
 77     public static final String REVERSAL_SQL_END="</sql>";
 78     public static final String REVERSAL_METHOD_START="<method>";
 79     public static final String REVERSAL_METHOD_END="</method>";
 80     public static final String REVERSAL_NAMESPACE_START="<namespace>";
 81     public static final String REVERSAL_NAMESPACE_END="</namespace>";
 82     public static final String REVERSAL_ERRORMSG_START="<errorMsg>";
 83     public static final String REVERSAL_ERRORMSG_END="</errorMsg>";
 84     public static final String REVERSAL_PARA_START="<para ";
 85 
 86 
 87 
 88     //流水号
 89     public static final String ERROR_AAZ999_START="aaz999="";
 90     public static final String ERROR_AAZ999_END="" ";
 91 
 92     //时间戳
 93     public static final String ERROR_AAE036_START="aae036="";
 94     public static final String ERROR_AAE036_END=""";
 95 
 96     /**
 97      * 构造要发送的SOAP消息
 98      * 
 99      * @param head
100      *            SOAP验证头
101      * @param env
102      *            消息体
103      * @return
104      */
105     public static String buildSOAP(String head, String env) {
106         StringBuffer soapBuf = new StringBuffer();
107         {
108             soapBuf.append(XML_PI);
109             soapBuf.append(ENVELOP_START);
110 
111             soapBuf.append(HEAD_START);
112             
113             soapBuf.append(head);
114 
115             soapBuf.append(HEAD_END);
116 
117             soapBuf.append(BODY_START);
118             soapBuf.append(getSoapBody(env));
119             soapBuf.append(BODY_END);
120 
121             soapBuf.append(ENVELOP_END);
122         }
123 
124         return soapBuf.toString();
125     }
126 
127     /**
128      * 获取消息信息体
129      * 
130      * @param envelop
131      *            消息信封
132      * @return 返回消息体
133      */
134     public static String getSoapBody(String envelop) {
135         if (null == envelop) {
136             return "";
137         }
138         if (envelop.indexOf(BODY_START) < 0)
139             return "";
140 
141         return envelop.substring(envelop.indexOf(BODY_START)
142                 + BODY_START.length(), envelop.indexOf(BODY_END));
143     }
144 }
SoapEnvelop
  1 package com.socialsecurity.util;
  2 
  3 
  4 import com.socialsecurity.domain.soap.FileDataBody;
  5 import com.socialsecurity.domain.soap.ResultDataBody;
  6 import com.socialsecurity.domain.soap.SoapDatagram;
  7 import org.apache.commons.lang3.StringUtils;
  8 
  9 import java.util.List;
 10 import java.util.Map;
 11 
 12 public class SoapUtil {
 13 
 14     public static String readerSoapXMlOut(SoapDatagram datagram) {
 15         //构建标准Soap输出规范
 16         StringBuffer reXML = new StringBuffer();
 17         reXML.append(SoapEnvelop.XML_PI)
 18                 .append(SoapEnvelop.ENVELOP_START) //信封
 19                 .append(SoapEnvelop.HEAD_START)    //soap:header
 20                 .append(SoapEnvelop.HEAD_END)
 21                 .append(SoapEnvelop.BODY_START);    //soap:body
 22         //业务数据
 23         reXML.append(SoapEnvelop.BUSINESS_START); //out:business
 24         reXML.append(SoapEnvelop.Single_Row);
 25         reXML.append(SoapEnvelop.Retrieve_START);
 26 
 27         //业务出参集
 28         ResultDataBody resultDataBody = datagram.getOutdata();
 29         if (null != resultDataBody) {
 30             reXML.append("<row ");
 31             reXML.append("resultCode ="" + resultDataBody.getResultCode() + "" ");
 32             reXML.append("resultMessage ="" + resultDataBody.getResultMessage() + "" ");
 33             reXML.append("resultBody ="" + resultDataBody.getResultBody() + "" ");
 34             reXML.append(" />");
 35         }
 36 
 37 
 38         //数据集
 39         if ("1".equals(datagram.getFileFlag())) {
 40             List<FileDataBody> files = datagram.getFiles();
 41             for (FileDataBody file : files) {
 42                 String cloudPath = file.getCloudPath();
 43                 String fileType = file.getFileType();
 44                 String fileTradeNo = file.getFileTradeNo();
 45                 String fileDesc = file.getFileDesc();
 46                 reXML.append("<row ");
 47                 reXML.append("cloudPath ="" + cloudPath + "" ");
 48                 reXML.append("fileType ="" + fileType + "" ");
 49                 reXML.append("fileTradeNo ="" + fileTradeNo + "" ");
 50                 reXML.append("fileDesc ="" + fileDesc + "" ");
 51                 reXML.append(" />");
 52             }
 53         }
 54 
 55 
 56         reXML.append(SoapEnvelop.Retrieve_END)
 57                 .append(SoapEnvelop.BUSINESS_END);
 58 
 59 
 60         //系统公共响应参数
 61         reXML.append(SoapEnvelop.FAULT_START)   //soap:fault
 62                 .append(SoapEnvelop.FAULT_CODE_START) //faultcode
 63                 .append(datagram.getFaultCode())
 64                 .append(SoapEnvelop.FAULT_CODE_END)
 65                 .append(SoapEnvelop.FAULT_STR_START) //faultstring
 66 //                .append(SoapEnvelop.ERROR_MSG_START) //error msg
 67                 .append(datagram.getFaultstring())
 68 //                .append(SoapEnvelop.ERROR_MSG_END)
 69                 .append(SoapEnvelop.FAULT_STR_END)
 70                 .append("<channelNo>" + datagram.getChannelNo() + "</channelNo>")
 71                 .append("<signNo>" + datagram.getSignNo() + "</signNo>")
 72                 .append("<aac002>" + datagram.getAac002() + "</aac002>")
 73                 .append("<aaz999>" + datagram.getAaz999() + "</aaz999>")
 74                 .append("<aaz333>" + datagram.getAaz333() + "</aaz333>")
 75                 .append("<aae036>" + datagram.getAae036() + "</aae036>")
 76                 .append("<pageSize>" + StringUtils.defaultString(datagram.getPageSize()) + "</pageSize>")
 77                 .append("<cPage>" + StringUtils.defaultString(datagram.getcPage()) + "</cPage>")
 78                 .append("<fileFlag>" + datagram.getFileFlag() + "</fileFlag>")
 79 
 80 
 81                 .append(SoapEnvelop.FAULT_END);
 82 
 83         reXML.append(SoapEnvelop.BODY_END)
 84                 .append(SoapEnvelop.ENVELOP_END);
 85         return reXML.toString();
 86     }
 87 
 88     public static String readerSoapXMlOutList(String[] structs, List value) {
 89         //构建标准Soap输出规范
 90         StringBuffer reXML = new StringBuffer();
 91         reXML.append(SoapEnvelop.XML_PI)
 92                 .append(SoapEnvelop.ENVELOP_START) //信封
 93                 .append(SoapEnvelop.HEAD_START)    //soap:header
 94                 .append(SoapEnvelop.HEAD_END)
 95                 .append(SoapEnvelop.BODY_START);    //soap:body
 96         reXML.append(SoapEnvelop.BUSINESS_START); //out:business
 97         reXML.append(SoapEnvelop.Single_Row);
 98         reXML.append(SoapEnvelop.Retrieve_START);
 99         if (!(null == value) && value.size() > 0) {
100             for (int j = 0; j < value.size(); j++) {
101                 reXML.append("<row ");
102                 Map<String, Object> valueMap = (Map) value.get(j);
103                 for (int i = 0; i < structs.length; i++) {
104                     reXML.append(structs[i] + "="" + (valueMap.get(structs[i]) == null ? "" : valueMap.get(structs[i])) + "" ");
105                 }
106                 reXML.append(" />");
107             }
108         }
109         reXML.append(SoapEnvelop.Retrieve_END)
110                 .append(SoapEnvelop.BUSINESS_END)
111                 .append(SoapEnvelop.BODY_END)
112                 .append(SoapEnvelop.ENVELOP_END);
113         return reXML.toString();
114     }
115 
116     public static String BuildSoapXMlError(String errorCode, String errorMsg) {
117         //构建标准Soap输出规范
118         StringBuffer reXML = new StringBuffer(SoapEnvelop.XML_PI);
119         reXML.append(SoapEnvelop.ENVELOP_START) //信封
120                 .append(SoapEnvelop.HEAD_START)    //soap:header
121                 .append(SoapEnvelop.HEAD_END)
122                 .append(SoapEnvelop.BODY_START);    //soap:body
123         reXML.append(SoapEnvelop.FAULT_START)   //soap:fault
124                 .append(SoapEnvelop.FAULT_CODE_START) //faultcode
125                 .append(errorCode)
126                 .append(SoapEnvelop.FAULT_CODE_END)
127                 .append(SoapEnvelop.FAULT_STR_START) //faultstring
128                 .append(SoapEnvelop.ERROR_MSG_START) //error msg
129                 .append(errorMsg)
130                 .append(SoapEnvelop.ERROR_MSG_END)
131                 .append(SoapEnvelop.FAULT_STR_END)
132                 .append(SoapEnvelop.FAULT_END);
133         reXML.append(SoapEnvelop.BODY_END)
134                 .append(SoapEnvelop.ENVELOP_END);
135         return reXML.toString();
136     }
137 
138     public static String readerSoapXMlOut(String[] structs, String[] value, String structsname[]) {
139         //构建标准Soap输出规范
140         StringBuffer reXML = new StringBuffer();
141         reXML.append(SoapEnvelop.XML_PI)
142                 .append(SoapEnvelop.ENVELOP_START) //信封
143                 .append(SoapEnvelop.HEAD_START)    //soap:header
144                 .append(SoapEnvelop.HEAD_END)
145                 .append(SoapEnvelop.BODY_START);    //soap:body
146         reXML.append(SoapEnvelop.BUSINESS_START); //out:business
147         reXML.append(SoapEnvelop.Single_Row);
148         reXML.append(SoapEnvelop.Structs_START);
149         for (int i = 0; i < structsname.length; i++) {
150             reXML.append("<row label="" + structsname[i] + "" columnname="" + structs[i] + "" typename="Varchar2" displaysize="20"/>");
151         }
152         reXML.append(SoapEnvelop.Structs_END);
153         reXML.append(SoapEnvelop.Retrieve_START);
154         reXML.append("<row ");
155         for (int i = 0; i < structs.length; i++) {
156             reXML.append(structs[i] + "="" + value[i] + "" ");
157         }
158         reXML.append(" />");
159         reXML.append(SoapEnvelop.Retrieve_END)
160                 .append(SoapEnvelop.BUSINESS_END)
161                 .append(SoapEnvelop.BODY_END)
162                 .append(SoapEnvelop.ENVELOP_END);
163         return reXML.toString();
164     }
165 }
SoapUtil
  1 package com.socialsecurity.util;
  2 
  3 import com.google.common.collect.Lists;
  4 import com.google.common.collect.Maps;
  5 import com.eva.core.web.validate.ResponseCode;
  6 import com.esb.client.XMLRequest;
  7 import org.dom4j.Attribute;
  8 import org.dom4j.Document;
  9 import org.dom4j.DocumentHelper;
 10 import org.dom4j.Element;
 11 
 12 import java.util.*;
 13 
 14 public class EsbUtil {
 15 
 16     private XMLRequest xmlRequest;
 17 
 18     public XMLRequest getXmlRequest() {
 19         return xmlRequest;
 20     }
 21 
 22     public void setXmlRequest(XMLRequest xmlRequest) {
 23         this.xmlRequest = xmlRequest;
 24     }
 25 
 26     /**
 27      * 返回List 数组
 28      *
 29      * @param xmlStr
 30      * @return
 31      */
 32     public static Object parseData(String xmlStr) {
 33         // 解析xml文档
 34         List allData = new ArrayList();
 35         try {
 36             //根据xml文本获取Document对象
 37             Document doc = DocumentHelper.parseText(xmlStr);
 38             //获取根节点元素对象
 39             Element root = doc.getRootElement();
 40             //获取所有的节点
 41             List<Element> rows = root.elements();
 42             //获取xml的身体数据
 43             List<Element> bodyData = rows.get(1).elements();
 44             String faultcode = "";
 45             String msg = "";
 46             //结构体
 47             List<Element> resultsetList = new ArrayList<Element>();
 48             List<Element> resultList = new ArrayList<Element>();
 49             List<String> informationList = new ArrayList<String>();
 50             List<String> errorMsgList = new ArrayList<String>();
 51             for (Element bodyChild : bodyData) {
 52                 List<Element> business = bodyChild.elements();
 53                 for (Element e : business) {
 54                     //获取其属性
 55                     if ("result".equals(e.getQName().getName())) {
 56                         resultList.add(e);
 57                     } else if ("retrieve".equals(e.attributeValue("name"))) {
 58                         resultsetList.add(e);
 59                     }
 60                     // 提示信息
 61                     if (e.attribute("information") != null) {
 62                         informationList.add(e.attribute("information")
 63                                 .getValue());
 64                     }
 65                     // 出错信息
 66                     if ("faultcode".equals(e.getName())) {
 67                         faultcode = e.getData().toString();
 68                     }
 69                     if ("faultstring".equals(e.getName())) {
 70                         List<Element> errorList = e.elements();
 71                         for (Element errorElement : errorList) {
 72                             errorMsgList
 73                                     .add(errorElement.attribute("msg") == null ? null
 74                                             : errorElement.attribute("msg")
 75                                             .getValue());
 76                         }
 77                     }
 78                 }
 79             }
 80             if ((informationList.size() >= 0 && errorMsgList.size() == 0)) {
 81                 for (Element resultset : resultsetList) {
 82                     int retrieveLen = 0;
 83                     // 解析每个字段名
 84                     for (Iterator<?> retrieveRow = resultset.elementIterator(); retrieveRow
 85                             .hasNext(); retrieveLen++) // 记录数--行数
 86                     {
 87                         Element roweValueElement = (Element) retrieveRow.next();// soap
 88                         // 结构体
 89                         // retrieve
 90                         HashMap<String, Object> data = new HashMap<String, Object>();
 91                         List<Attribute> listAttr = roweValueElement.attributes();
 92                         for (Attribute attribute : listAttr) {
 93                             data.put(attribute.getName(), attribute.getValue());
 94                         }
 95                         allData.add(data);
 96                     }
 97                 }
 98             }
 99             for (String object : errorMsgList) {
100                 msg += object;
101             }
102             if (!"".equals(msg)) {
103                 HashMap map = new HashMap();
104                 map.put("code", faultcode);
105                 map.put("msg", msg);
106                 allData.add(map);
107             }
108             return allData;
109         } catch (Exception e) {
110             HashMap map = new HashMap();
111             map.put("code", "800");
112             map.put("msg", "报文解析错误");
113             allData.add(map);
114             return allData;
115         }
116     }
117 
118     /**
119      * 分页解析
120      *
121      * @param xmlStr
122      * @return Map  key为 page  值为map{‘cpage’,‘pages’,‘rowCount’}
123      * key 为 msg 值为map{‘code’,‘msg}
124      * key 为 data 值为list
125      */
126     public static Map parsePageData(String xmlStr) {
127         // 解析xml文档
128         Map allData = Maps.newHashMap();
129         try {
130             //根据xml文本获取Document对象
131             Document doc = DocumentHelper.parseText(xmlStr);
132             //获取根节点元素对象
133             Element root = doc.getRootElement();
134             //获取所有的节点
135             List<Element> rows = root.elements();
136             //获取xml的身体数据
137             List<Element> bodyData = rows.get(1).elements();
138             //分页对象
139             Map<String, String> pageMap = Maps.newHashMap();
140             String faultcode = "";
141             String msg = "";
142             //结构体
143             List<Element> resultsetList = new ArrayList<Element>();
144             List<Element> resultList = new ArrayList<Element>();
145             List<String> informationList = new ArrayList<String>();
146             List<String> errorMsgList = new ArrayList<String>();
147             for (Element bodyChild : bodyData) {
148                 List<Element> business = bodyChild.elements();
149                 for (Element e : business) {
150                     //获取其属性
151                     if ("result".equals(e.getQName().getName())) {
152                         resultList.add(e);
153                     } else if ("retrieve".equals(e.attributeValue("name"))) {
154                         resultsetList.add(e);
155                     }
156                     // 提示信息
157                     if (e.attribute("information") != null) {
158                         informationList.add(e.attribute("information")
159                                 .getValue());
160                         errorMsgList.add(e.attribute("information")
161                                 .getValue());
162                     }
163                     // 出错信息
164                     if ("faultcode".equals(e.getName())) {
165                         faultcode = String.valueOf(e.getData());
166                     }
167                     if ("faultstring".equals(e.getName())) {
168                         List<Element> errorList = e.elements();
169                         for (Element errorElement : errorList) {
170                             errorMsgList
171                                     .add(errorElement.attribute("msg") == null ? null
172                                             : errorElement.attribute("msg")
173                                             .getValue());
174                         }
175                     }
176                 }
177             }
178             if (resultList.size() > 0) {
179                 for (Element element : resultList) {
180                     List<Attribute> list = element.attributes();
181                     for (Attribute attribute : list) {
182                         pageMap.put(attribute.getName(), attribute.getValue());
183                     }
184                 }
185                 allData.put("page", pageMap);
186             }
187             if ((informationList.size() >= 0 && errorMsgList.size() == 0)) {
188                 allData.put("code", "0");
189                 allData.put("msg", "调用成功");
190                 List list = Lists.newArrayList();
191                 for (Element resultset : resultsetList) {
192                     // 解析每个字段名
193                     for (Iterator<?> retrieveRow = resultset.elementIterator(); retrieveRow
194                             .hasNext(); ) // 记录数--行数
195                     {
196                         Element roweValueElement = (Element) retrieveRow.next();
197                         // 结构体
198                         // retrieve
199                         HashMap data = Maps.newHashMap();
200                         List<Attribute> listAttr = roweValueElement.attributes();
201                         for (Attribute attribute : listAttr) {
202                             data.put(attribute.getName(), attribute.getValue());
203                         }
204                         list.add(data);
205                     }
206                 }
207                 allData.put("data", list);
208             }
209             for (String object : errorMsgList) {
210                 msg += object;
211             }
212             if (!"".equals(msg)) {
213                 allData.put("code", faultcode);
214                 allData.put("msg", msg);
215             }
216             return allData;
217         } catch (Exception e) {
218             allData.put("code", "800");
219             allData.put("msg", "报文解析错误");
220             return allData;
221         }
222     }
223 
224     /**
225      * 解析返回一条数据
226      *
227      * @param xmlStr
228      * @return
229      */
230     public static Map parseOne(String xmlStr) {
231         Map map = parsePageData(xmlStr);
232         if (ResponseCode.SUCCESS.equals(map.get("code"))) {
233             List data = (List) map.get("data");
234             Map oneMap = (Map) data.get(0);
235             map.put("data", oneMap);
236         }
237         map.remove("page");
238         return map;
239     }
240 
241 
242     public static Map parseDataV2(String xml) {
243         // 解析xml文档
244         Map allData = new LinkedHashMap();
245         try {
246             //根据xml文本获取Document对象
247             Document doc = DocumentHelper.parseText(xml);
248             //获取根节点元素对象
249             Element root = doc.getRootElement();
250             //获取所有的节点
251             List<Element> rows = root.elements();
252             //获取xml的身体数据
253             List<Element> bodyData = rows.get(1).elements();
254             //结构体
255             List<Element> resultsetList = new ArrayList<Element>();
256             List<Element> resultList = new ArrayList<Element>();
257             Map<String, String> errorMap = new LinkedHashMap<>();
258             for (Element bodyChild : bodyData) {
259                 List<Element> business = bodyChild.elements();
260                 for (Element e : business) {
261                     //获取其属性
262                     if ("result".equals(e.getQName().getName())) {
263                         resultList.add(e);
264                     } else if ("retrieve".equals(e.attributeValue("name"))) {
265                         resultsetList.add(e);
266                     } else {
267                         // 出错信息
268                         if ("faultcode".equals(e.getName())) {
269                             String faultcode = String.valueOf(e.getData());
270                             allData.put("faultCode", faultcode);
271                         }
272                         if ("faultstring".equals(e.getName())) {
273                             String faultstring = String.valueOf(e.getData());
274                             allData.put("faultString", faultstring);
275                         }
276                         if ("channelNo".equals(e.getName())) {
277                             String channelNo = String.valueOf(e.getData());
278                             allData.put("channelNo", channelNo);
279                         }
280                         if ("signNo".equals(e.getName())) {
281                             String signNo = String.valueOf(e.getData());
282                             allData.put("signNo", signNo);
283                         }
284                         if ("aac002".equals(e.getName())) {
285                             String aac002 = String.valueOf(e.getData());
286                             allData.put("aac002", aac002);
287                         }
288                         if ("aaz999".equals(e.getName())) {
289                             String aaz999 = String.valueOf(e.getData());
290                             allData.put("aaz999", aaz999);
291                         }
292                         if ("aaz333".equals(e.getName())) {
293                             String aaz333 = String.valueOf(e.getData());
294                             allData.put("aaz333", aaz333);
295                         }
296                         if ("aae036".equals(e.getName())) {
297                             String aae036 = String.valueOf(e.getData());
298                             allData.put("aae036", aae036);
299                         }
300                         if ("pageSize".equals(e.getName())) {
301                             String pageSize = String.valueOf(e.getData());
302                             allData.put("pageSize", pageSize);
303                         }
304                         if ("cPage".equals(e.getName())) {
305                             String cPage = String.valueOf(e.getData());
306                             allData.put("cPage", cPage);
307                         }
308                         if ("fileFlag".equals(e.getName())) {
309                             String fileFlag = String.valueOf(e.getData());
310                             allData.put("fileFlag", fileFlag);
311                         }
312                     }
313 
314                 }
315             }
316 
317 
318             // retrieve
319             List list = Lists.newArrayList();
320             for (Element resultset : resultsetList) {
321                 // 解析每个字段名
322                 for (Iterator<?> retrieveRow = resultset.elementIterator(); retrieveRow
323                         .hasNext(); ) // 记录数--行数
324                 {
325                     Element roweValueElement = (Element) retrieveRow.next();
326                     // 结构体
327                     // retrieve
328                     Map data = new LinkedHashMap();
329                     List<Attribute> listAttr = roweValueElement.attributes();
330                     for (Attribute attribute : listAttr) {
331                         data.put(attribute.getName(), attribute.getValue());
332                     }
333                     list.add(data);
334                 }
335             }
336 
337 //            allData.put("faultCode", faultcode);
338 //            for (Map.Entry<String, String> entry : errorMap.entrySet()) {
339 //                allData.put(entry.getKey(), entry.getValue());
340 //            }
341 
342             if (list.size() != 0) {
343                 Map outData = (Map) list.get(0);
344                 allData.put("outData", outData);
345 
346                 list.remove(0);
347                 allData.put("files", list);
348             }
349 
350             return allData;
351         } catch (Exception e) {
352             allData.put("faultCode", "800");
353             allData.put("faultString", "报文解析错误");
354             return allData;
355         }
356     }
357 }
EsbUtil

测试结果:

1 <?xml version="1.0" encoding="GBK"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><soap:Header><out:system xmlns:out="http://www.ylzinfo.com/"></out:system></soap:Header><soap:Body><out:business xmlns:out="http://www.ylzinfo.com/"><result showtype="1"/><resultset name="retrieve"><row resultCode ="0" resultMessage ="请求成功" resultBody ="null"  /><row cloudPath ="www.baidu.com" fileType ="txt" fileTradeNo ="12345678" fileDesc ="测试"  /></resultset></out:business><soap:Fault><faultcode>0</faultcode><faultstring>请求成功</faultstring><channelNo>1400000001</channelNo><signNo>1111111111111111111</signNo><aac002>373738383927711231</aac002><aaz999>1234567890</aaz999><aaz333>12312312312</aaz333><aae036>1578988937192</aae036><pageSize></pageSize><cPage></cPage><fileFlag>1</fileFlag></soap:Fault></soap:Body></soap:Envelope>
2 {"faultCode":"0","faultString":"请求成功","channelNo":"1400000001","signNo":"1111111111111111111","aac002":"373738383927711231","aaz999":"1234567890","aaz333":"12312312312","aae036":"1578988937192","pageSize":"","cPage":"","fileFlag":"1","outData":{"resultCode":"0","resultMessage":"请求成功","resultBody":"null"},"files":[{"cloudPath":"www.baidu.com","fileType":"txt","fileTradeNo":"12345678","fileDesc":"测试"}]}
View Code
原文地址:https://www.cnblogs.com/hoje/p/11868565.html