工作中涉及到调用ESB总线上的接口,接口的请求类型是application/xml,请求方法为POST,接口接收xml格式的报文,返回xml格式的报文。
本文对Java使用POST方式调用XML接口并使用dom4j解析返回的xml报文,获取xml报文重要标签信息的方法做了介绍。
首先是JAVA使用POST请求调用XML接口,这里使用了org-apache-commons-httpclient,需要在maven导入如下依赖:
<dependency>
<groupId>org.kie.modules</groupId>
<artifactId>org-apache-commons-httpclient</artifactId>
<version>6.2.0.CR2</version>
<type>pom</type>
</dependency>
准备好xml接口的请求地址与请求报文,获取HttpClient对象与PostMethod对象,将请求地址与请求体传入PostMethod,并使用HttpClient去发送请求。其中报文体封装在RequestEntity对象中。
StringBuffer sb = new StringBuffer();
sb.append("请求报文");
String data = sb.toString();
String url = "请求地址";
HttpClient httpclient = new HttpClient();
PostMethod post = new PostMethod(url);
String info = null;
try{
RequestEntity entity = new StringRequestEntity(data, "text/xml",
"iso-8859-1");
post.setRequestEntity(entity);
httpclient.executeMethod(post);
int code = post.getStatusCode();
if (code == HttpStatus.SC_OK)
info = new String(post.getResponseBodyAsString()); //接口返回的信息
} catch (Exception ex) {
ex.printStackTrace();
} finally {
post.releaseConnection();
}
获取到返回的info报文信息,使用dom4j来解析其中的标签,dom4j的maven依赖如下:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.0.0</version>
</dependency>
返回的报文结构如下:
<ESBRESP>
<HEADER>
<CODE>100</CODE>
<MSG>OK</MSG>
</HEADER>
<XMLDATA><![CDATA[<GET_PERIMAGE_RESP>
<HEADER>
<ROW_COUNT>1</ROW_COUNT>
</HEADER>
<ITEMS>
<ITEM>
<STAFF_NO>0001</STAFF_NO>
<PHOTO>photoData</PHOTO>
</ITEM>
</ITEMS></GET_PERIMAGE_RESP>]]></XMLDATA>
</ESBRESP>
如图,笔者要取得标签信息是PHOTO标签中的photoData,但是这个信息在CDATA里面。因此,解析步骤分为两步:
1、解析整个xml报文,根据XMLDATA标签获取到CDATA的内容。
2、把CDATA的内容当作另一个完整的xml报文,去获取其中的PHOTO标签。
代码如下:
//获取XMLDATA中的数据
Document document = DocumentHelper.parseText(info);
Element cData = document.getRootElement().element("XMLDATA");
//把XMLDATA的数据当作另一个xml文本去解析
Document document1 = DocumentHelper.parseText(cData.getText()); System.out.println(document1.getRootElement().element("ITEMS").element("ITEM").element("PHOTO").getText());
整体还是非常简单的。