博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java dom4j解析RESTFull风格发布的WebService的xml文件
阅读量:5156 次
发布时间:2019-06-13

本文共 9508 字,大约阅读时间需要 31 分钟。

   公司项目要求解析出RESTFull风格发布的WebService接口的所有请求方法,参数,参数类型,已经方法是返回类型,想来想去都不知道该怎么办,思来想去然后又研究RESTFull风格WebService的xml文件,发现其实对于Java简单类型的 方法是能在xml文件中体现的,但是对于复杂类型,比如参数是一个对象,或者返回值是一个对象或者List,Map等。这些返回类型在xml文件中的 response下representation这个节点的属性type会是一个"application/json"。对于这些返回类型或者参数我没法 知道是什么类型,所以我就默认给这些Object类型。对于void类型的方法,会在response的status属性等于204,所以我就笨笨的用HttpClient抓去整个xml文件,然后用dome4j解析这个xml,幸好的是我在项目只需要解析简单类型的方法,所以想想也能达到要求.

1 package xxx.xxx.common;  2    3  import java.util.List;  4    5  import org.apache.commons.httpclient.HttpClient;  6  import org.apache.commons.httpclient.HttpStatus;  7  import org.apache.commons.httpclient.methods.GetMethod;  8  import org.dom4j.Document;  9  import org.dom4j.DocumentException; 10  import org.dom4j.DocumentHelper; 11  import org.dom4j.Element; 12   13  import com.google.common.collect.Lists; 14  import com.qya.vo.transform.TransformParamVO; 15  import com.qya.vo.transform.TransformVO; 16   17  import com.qya.utils.string.StringUtil; 18   19  public class TransformWsUrlUtil { 20   21      protected final String DEFAULT_URL = "http://localhost:8080/bpms/services?_wadl"; 22   23      public static List
transform(String url) { 24 String xml = getTransformXml(url); 25 Document doc = null; 26 try { 27 doc = DocumentHelper.parseText(xml); 28 } catch (DocumentException e) { 29 e.printStackTrace(); 30 } 31 List
lst = Lists.newArrayList(); 32 String rootPath = ""; 33 Element resourcesEl = doc.getRootElement().element("resources"); 34 if (resourcesEl.hasContent()) { 35 List
els = resourcesEl.elements(); 36 for (Element resEl : els) { 37 rootPath = resEl.attribute(0).getText(); 38 if (resEl.hasContent()) { 39 lst.addAll(getMethod(rootPath, resEl.elements())); 40 } 41 } 42 } 43 return lst; 44 } 45 46 // 所有方法列表 47 public static List
getMethod(String rootPath, List
els) { 48 List
lst = Lists.newArrayList(); 49 String wsPath = ""; 50 String returnType = ""; 51 for (Element el : els) { 52 returnType = transform2JavaType(getReturnType(el)); 53 wsPath = el.attribute("path").getText(); 54 if(!"java.lang.Object".equals(returnType)){ //此处我做了判断,只需要简单类型和void类型的方法 55 TransformVO vo = new TransformVO(); 56 vo.setUrl(transform2JavaType(rootPath + wsPath)); 57 vo.setUrlMethodName(transform2JavaType(returnType + " " + replaceSeparatorLine(wsPath) + getParamters(el))); 58 vo.setMethodName(transform2JavaType(wsPath)); 59 vo.setReturnType(returnType); 60 List
paramLst = getParamterVO(el); 61 vo.setTransformParamLst(paramLst); 62 lst.add(vo); 63 } 64 } 65 return lst; 66 } 67 68 /** 69 * 获取方法的所有参数 70 * 71 * @param el 72 * @return 参数字符串 73 */ 74 public static String getParamters(Element el) { 75 StringBuffer buf = new StringBuffer("("); 76 Element requestEl = el.element("method").element("request"); 77 if (!StringUtil.isNullOrEmpty(requestEl)) { 78 if (requestEl.hasContent()) { 79 for (Element paramEl : (List
) requestEl.elements()) { 80 if ("param".equals(paramEl.getName())) { 81 buf.append(paramEl.attributeValue("type") + " " + paramEl.attributeValue("name") + ", "); 82 } 83 if ("representation".equals(paramEl.getName())) { 84 if (paramEl.hasContent()) { 85 for (Element pEl : (List
) paramEl.elements()) { 86 buf.append(pEl.attributeValue("type") + " " + pEl.attributeValue("name") + ", "); 87 } 88 } 89 } 90 } 91 } 92 } 93 buf.append(")"); 94 return buf.toString(); 95 } 96 97 public static List
getParamterVO(Element el) { 98 List
lst = Lists.newArrayList(); 99 Element requestEl = el.element("method").element("request");100 if (!StringUtil.isNullOrEmpty(requestEl)) {101 if (requestEl.hasContent()) {102 for (Element paramEl : (List
) requestEl.elements()) {103 if ("param".equals(paramEl.getName())) {104 TransformParamVO vo = new TransformParamVO();105 vo.setName(paramEl.attributeValue("name"));106 vo.setType(transform2JavaType(paramEl.attributeValue("type")));107 lst.add(vo);108 }109 if ("representation".equals(paramEl.getName())) {110 if (paramEl.hasContent()) {111 for (Element pEl : (List
) paramEl.elements()) {112 TransformParamVO vo = new TransformParamVO();113 vo.setName(pEl.attributeValue("name"));114 vo.setType(transform2JavaType(pEl.attributeValue("type")));115 lst.add(vo);116 }117 }118 }119 }120 }121 }122 return lst;123 }124 125 /*126 * 获取返回类型127 */128 public static String getReturnType(Element el) {129 String returnType = "";130 List
returnTypeEls = el.element("method").element("response").elements("representation");131 if (!StringUtil.isNullOrEmpty(returnTypeEls)) {132 if (returnTypeEls.isEmpty()) {133 if (!StringUtil.isNullOrEmpty(el.element("method").element("response").attribute("status"))) {134 if ("204".equals(el.element("method").element("response").attribute("status").getText())) {135 returnType = "void";136 }137 }138 } else {139 for (Element returnTypeEl : returnTypeEls) {140 if (returnTypeEl.hasContent()) {141 for (Element pEl : (List
) returnTypeEl.elements()) {142 returnType = pEl.attributeValue("type");143 }144 } else {145 returnType = "java.lang.Object";146 }147 }148 }149 }150 return returnType;151 }152 153 private static String transform2JavaType(String str) {154 if (!StringUtil.isNullOrEmpty(str)) {155 if (str.contains("xs:int")) {156 str = str.replaceAll("xs:int", "java.lang.Integer");157 }158 if (str.contains("xs:string")) {159 str = str.replaceAll("xs:string", "java.lang.String");160 }161 if (str.contains("xs:boolean")) {162 str = str.replaceAll("xs:boolean", "java.lang.Boolean");163 }164 if (str.contains("xs:double")) {165 str = str.replaceAll("xs:double", "java.lang.Double");166 }167 if (str.contains("xs:dateTime")) {168 str = str.replaceAll("xs:dateTime", "java.util.Date");169 }170 if (str.lastIndexOf(",") > 0) {171 str = str.substring(0, str.lastIndexOf(",")) + ")";172 }173 }174 return str;175 }176 private static String replaceSeparatorLine(String str) {177 if (!StringUtil.isNullOrEmpty(str)) {178 if (str.contains("/")) {179 str = str.replaceAll("\\/", "");180 }181 }182 return str;183 }184 185 /**186 * 后去需要转换的xml内容187 * 188 * @param url189 * 访问的webservice url190 * @return xml内容191 */192 private static String getTransformXml(String url) {193 String xml = "";194 HttpClient httpClient = new HttpClient();195 GetMethod getMethod = new GetMethod(url);196 try {197 int statusCode = httpClient.executeMethod(getMethod);198 if (statusCode != HttpStatus.SC_OK) {199 System.err.println("Method failed: " + getMethod.getStatusLine());200 }201 // 读取内容202 byte[] responseBody = getMethod.getResponseBody();203 // 处理内容204 xml = new String(responseBody);205 } catch (Exception e) {206 System.err.println("页面无法访问");207 } finally {208 getMethod.releaseConnection();209 }210 return xml;211 }212 213 }

TransformVO.java

1 package com.qya.vo.transform; 2   3  import java.io.Serializable; 4  import java.util.List; 5   6  import com.google.common.collect.Lists; 7   8  public class TransformVO implements Serializable { 9      10      private static final long serialVersionUID = -8192032660217273046L;11      private String url;12      private String urlMethodName;13      private String methodName;14      private String returnType;15      private List
transformParamLst = Lists.newArrayList();16 public String getUrl() {17 return url;18 }19 public void setUrl(String url) {20 this.url = url;21 }22 public String getUrlMethodName() {23 return urlMethodName;24 }25 public void setUrlMethodName(String urlMethodName) {26 this.urlMethodName = urlMethodName;27 }28 public String getMethodName() {29 return methodName;30 }31 public void setMethodName(String methodName) {32 this.methodName = methodName;33 }34 public String getReturnType() {35 return returnType;36 }37 public void setReturnType(String returnType) {38 this.returnType = returnType;39 }40 public List
getTransformParamLst() {41 return transformParamLst;42 }43 public void setTransformParamLst(List
transformParamLst) {44 this.transformParamLst = transformParamLst;45 }46 }

 TransformParamVO.java

1 package com.qya.vo.transform; 2   3  import java.io.Serializable; 4   5  public class TransformParamVO implements Serializable { 6   7      private static final long serialVersionUID = 2728404017781534263L; 8      private String type; 9      private String name;10      public String getType() {11          return type;12      }13      public void setType(String type) {14          this.type = type;15      }16      public String getName() {17          return name;18      }19      public void setName(String name) {20          this.name = name;21      }22      23  }
StringUtil.java
1 package com.qya.utils.string.StringUtil 2  3 public class StringUtil { 4  5     /** 6      * 判断是否为空后null 7      *  8      * @param obj 9      *            对象10      * @return boolean11      * @since 1.012      */13     public static boolean isNullOrEmpty(Object obj) {14         return obj == null || "".equals(obj.toString());15     }16 }

 

 

转载于:https://www.cnblogs.com/quanyongan/archive/2013/04/17/3027291.html

你可能感兴趣的文章
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
(VC/MFC)多线程(Multi-Threading) -1. 基本概念.
查看>>
快数据时代下,Moka携手DataPipeline提升招聘效能
查看>>
day1 用户登陆三次机会
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
LeetCode Ones and Zeroes
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
css important
查看>>
KindEditor图片上传到七牛云
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
批处理/DOS命令删除文件夹下某类型的文件
查看>>
模板 - 数学 - 矩阵快速幂
查看>>
优秀的持久层框架Mybatis,连接数据库快人一步
查看>>