背景:需要调用c#接口获取数据,传参格式为xml,返回值也为xml,因此需要解析xml获取数据。
dom4j介绍:
dom4j是dom4j.orj出品的一个开源XML解析包。它主要应用于Java平台,并采用了Java集合框架并完全支持DOM、SAX和JAXP。
使用思路:创建document 文档对象,然后根据xml的根节点依次拼接elment属性,
代码如下
org.dom4j.Document document=DocumentHelper.createDocument();
document.setXMLEncoding("utf-8");
Element soapEnvelop=document.addElement("soap:Envelope");
soapEnvelop.addAttribute("xmlns:xsi", "http://xxxxxxx")
.addNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");
soapEnvelop.addAttribute("xmlns:xsd", "http://xxxxxxx")
.addNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
soapEnvelop.addAttribute("xmlns:soap", "http://xxxxxxxx")
.addNamespace("soap", "http://xxxxxx");
Element soapheader=soapEnvelop.addElement("soap:Header");
Element mysoap=soapheader.addElement("MySoapHeader","http://txxxxxx.org/");
Element errinfo=mysoap.addElement("errinfo");
errinfo.setText(errinfo1);
Element userid=mysoap.addElement("UserID");
userid.setText(user_id);
Element password1=mysoap.addElement("Password");
password1.setText(password);
Element soapbody=soapEnvelop.addElement("soap:Body");
Element getbsh=soapbody.addElement("GetBsh","http://xxxxxx.org/");
Element sfaren1=getbsh.addElement("sFaren");
sfaren1.setText(sfaren);
Element sbsh01Element=getbsh.addElement("123");
sbsh01Element.setText(sbsh01);
Element sbsh02Element=getbsh.addElement("1233");
sbsh02Element.setText(sbsi02);
Element sbsi12Element=getbsh.addElement("12333");
sbsi12Element.setText(sbsi12);
Element sbsi13Element=getbsh.addElement("12333");
sbsi13Element.setText(sbsi13);
Element sbdatElement=getbsh.addElement("3221");
sbdatElement.setText(sbdate);
Element sedateElement=getbsh.addElement("231");
sedateElement.setText(sedate);
System.out.println(document.asXML());
String soapXML=document.asXML();
以上步骤仅仅只是完成了第一步设置参数,只是把参数设置成c#可以识别的xml格式
下一步调用接口将我们定义完成的document对象传入url中
URL url = new URL("https://xxxxxx/zkwebservice.asmx");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3:设置连接参数
// 3.1设置发送方式:POST必须大写
connection.setRequestMethod("POST");
// 3.2设置数据格式:Content-type
connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
// 3.3设置输入输出,新创建的connection默认是没有读写权限的,
connection.setDoInput(true);
connection.setDoOutput(true);
java.io.OutputStream os = connection.getOutputStream();
os.write(soapXML.getBytes());
logger.info("byte參數1:" + soapXML);
int responseCode = connection.getResponseCode();
logger.info("返回Code1:" + responseCode);
StringBuilder sb = new StringBuilder();
String resultstr = "";
if (200 == responseCode) {// 表示服务端响应成功
logger.info("xml响应成功1");
InputStream is = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
String temp = null;
while (null != (temp = br.readLine())) {
sb.append(temp);
}
logger.info("xml响应成功xxx000");
resultstr = sb.toString();
logger.info("xml响应成功xxx111000");
is.close();
isr.close();
br.close();
}
os.close();//关闭流
将读取数据存入resultstr中,下一步就是读取,将数据处理成我们需要的格式
if (resultstr != null) {
logger.info("xml响应成功000");
resultstr = resultstr.substring(resultstr.indexOf("<NewDataSet"),
resultstr.lastIndexOf("</NewDataSet>") + 13);
resultstr = resultstr.replace(" xmlns=\"\"", "");
resultstr = resultstr.replace("diffgr:", "");
resultstr = resultstr.replace("\" msdata:rowOrder=\"", "");
org.json.JSONObject json = XML.toJSONObject(resultstr);
logger.info("xml响应成功111222");
// 输出json内容
String result = json.toString();
result = result.split("\\[|\\]")[1];
result = "[" + result + "]";
// result=new String(result.getBytes(),"UTF-8");
logger.info("xml响应成功222");
list1.clear();
list1 = JSONArray.parseArray(result, CMdata.class);
// System.out.println(list1);
logger.info("xml响应成功333");
}
}catch (RuntimeException runtime) {
runtime.printStackTrace();// 打印异常信息
}
catch (Exception e) {
}
logger.info(">>>>>>>>>>>>>>>>>>>>抓取部门资料-END>>>>>>>>>>>>>>>>>>>");
这里的list需要自己去定义类型。
老弟不太行,如果有瑕疵的地方,还望各位大佬指点一二!老弟不胜感激!