公司项目要求解析出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<TransformVO> 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<TransformVO> lst = Lists.newArrayList();
 32          String rootPath = "";
 33          Element resourcesEl = doc.getRootElement().element("resources");
 34          if (resourcesEl.hasContent()) {
 35              List<Element> 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<TransformVO> getMethod(String rootPath, List<Element> els) {
 48          List<TransformVO> 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<TransformParamVO> 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<Element>) 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<Element>) 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<TransformParamVO> getParamterVO(Element el) {
 98          List<TransformParamVO> 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<Element>) 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<Element>) 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<Element> 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<Element>) 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 url
189       *            访问的webservice url
190       * @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<TransformParamVO> 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<TransformParamVO> getTransformParamLst() {
41          return transformParamLst;
42      }
43      public void setTransformParamLst(List<TransformParamVO> 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 boolean
11      * @since 1.0
12      */
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

Java dom4j解析RESTFull风格发布的WebService的xml文件相关推荐

  1. java dom4j解析xml 对象_Java XML解析 - 利用DOM4j解析XML

    Java XML解析 - 利用DOM4j解析XML dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP ...

  2. java使用axis调用.net发布的webservice接口返回对象类型

    本人在java中axis-1.4 调用 .net发布的webService接口 有问题欢迎各路大神讨论 !!! 1.1 基本类型 1.2 对象类型 1.3复杂对象类型(对象类中嵌套对象类) 返回基本类 ...

  3. Java - DOM4J解析XML文件

    文章目录 1. XML文档说明 2. XML解析 2.1 常见的解析方式 2.2 DOM4J解析xml 2.3 XPath表达式解析XML 3. 解析XML并封装到类中 4. 参考资料 1. XML文 ...

  4. Java - Dom4J解析XML

    1.XML解析的方式 DOM: 要求解析器将整个XML文件全部加载到内存中,生成一个Document对象 1.优点:元素和元素之间保留结构,关系,可以针对元素进行CURD操作. 2.缺点:如果XML文 ...

  5. ANT 发布项目中 build.xml 文件的详细配置

    xml 代码 <?xml version="1.0" encoding="UTF-8"?> <!-- name:对应工程名字 default: ...

  6. java实体类转换xml_简单实体类和xml文件的相互转换方法

    最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简 ...

  7. Android学习笔记---26_网络通信之资讯客户端,使用pull解析器,解析,从网络中获得的自定义xml文件

    7.25_网络通信之资讯客户端 ---------------------------- 1.网络中一般是使用自己定义的格式比如:   案例:酷6网的视频客户端有一个功能:"在手机上显示最新 ...

  8. Java DOM4J解析String类型XML,Document对象转String

    解析String类型XML数据 Document doc = DocumentHelper.parseText(String text); ​​​​​​​ Document对象转String Stri ...

  9. dom4j 解析 xml 为 Java 对象

    引入的 jar 包 xml 文件 <?xml version="1.0" encoding="UTF-8" ?> <books>< ...

最新文章

  1. FPGA在人工智能时代的独特优势
  2. 计算机二级c语言109套,2016年9月计算机二级C语言操作题109套讲述.docx
  3. CTFshow 信息收集 web5
  4. 【C++】cannot access private member declared in class 'Box'
  5. dom4j jar包_XML解析之DOM4j以及XPATH技术
  6. numpy添加元素_科研速递 | 花费15年众望所归!NumPy论文终登上Nature!
  7. WPS for MacOS如何设置自动编号
  8. 【Java】while(scanner.hasNext()){}引发“死循环”的处理方法
  9. c语言第四版第8章答案,C语言答案第8章.doc
  10. webstorm tsx语法中,使用注释后,发现由红色error
  11. Cisco基本必须掌握命令
  12. Win11未检测到Logitech Unifying接收器的解决方法
  13. 文件夹html文件批量替换,DirRplacer(文件批量替换工具)
  14. noip模拟赛 whzzt-Warmth
  15. 油管最火KMP算法讲解,阿三哥的源代码!
  16. maya绳子建模(包含插件)
  17. linux ksoftirqd进程,ksoftirqd进程导致cpu消耗殆尽
  18. 路由器的静态路由配置以及OSPF动态配置
  19. APC PowerChute Business Edition 安装中的vmware问题
  20. plsql tables 里面不显示表格

热门文章

  1. android touch事件坐标原点,图解Android:Touch事件传递机制
  2. 照片看3秒就销毁的软件_3.9秒破百,比亚迪汉EV到店实拍:实车比照片更好看
  3. 默认适应窗口_PS教程基础之cs6默认快捷键汇总及补充
  4. 单位阶跃信号是周期信号吗_iPhone12的信号有改观吗?
  5. 擅长排列的小明(nyoj19)
  6. PSIM软件学习---01初识别PSIM软件
  7. C语言小知识---特殊的字符串
  8. 习题3.4 最长连续递增子序列 (20 分) 数据结构 PTA
  9. java代码中发送http请求的DnsResolver使用问题
  10. MYSQL 的集群