Jsoup解析WSDL文档代码示例
文章说明:本文章目的在于分享本人对wsdl文档的解析结果,希望可以通过本实例帮助大家了解如何解析wsdl中<types>元素下的所有的element元素。这是本人研究的一个方法,可能不是最好的,希望大家有想法的留言,一起学习、交流与进步~
文章目录
- Jsoup解析WSDL文档代码示例
- 前言
- 一、WSDL文档及其结构
- 二、jsoup介绍
- 三、实例代码展示
- 1.代码思路/结构展示
- 2.项目结构
- 3.代码示例
- 4.所解析的WSDL文档
- 5.解析运行结果
- 总结
前言
1、如果需要解析WSDL文档,首先就得了解WSDL文档本身,还没有的了解的可以去百度搜索了解,这个是解析的根本!2、了解WSDL文档后,就得找解析的工具帮助我们去解析了。此处使用了jsoup-1.11.2.jar;解析工具有很多,例如还有wsdl4j、dom4j等...
注意:工具并不是我们关注的重点,解析的方法和原理才是!
3、本“Jsoup解析WSDL文档实例”会尽量将代码与原理讲明白,此处以获取请求报文为例,让读者更容易看明白~
一、WSDL文档及其结构
WSDL(Web服务描述语言,Web Services Description Language)是为描述Web服务发布的XML格式。
由于本文档重点讲解代码及方法思路,此处请百度~
二、jsoup介绍
jsoup是一款Java的HTML解析器,主要用来对HTML解析。
当然了,也可以解析XML~
具体的用法此处暂不多讲,可以百度搜索、或查看官方API文档可以了解其用法。
三、实例代码展示
1.代码思路/结构展示
(1)方法步骤图解:
(2)WSDL文档图解(绿色箭头、描述是重点!):
2.项目结构
3.代码示例
代码示例(建议复制到开发工具):
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class ParseWSDLDemo1 {
public static void main(String[] args) throws IOException {
// 通过类加载器获取AA.xml的path,然后根据xml文档获取Document对象
String path = ParseWSDLDemo1.class.getClassLoader().getResource("WSDL_XSD_Schema_Test.xml").getPath();
// 解析xml文档,加载文档进内存,获取dom树
Document document = Jsoup.parse(new File(path), "utf-8");
// 打印检查document有没有获取成功
//System.out.println(document);
// 请求报文模板根节点element元素
Map<String, String> rootElements = getRootElemnts(document);
String requestRootElement = rootElements.get("requestElemnt");
System.out.println("<soa:" + requestRootElement + ">");
// 获取<types>下的所有complexType元素
Map<String, Element> complexTypes = getAllComplexType(document);
// 递归调用 -> 获取所有element元素
getElement(complexTypes, requestRootElement,1);
System.out.println("</soa:" + requestRootElement + ">");
}
public static void getElement(Map<String, Element> complexTypes, String elementTypeName, int countOfCall) {
//System.out.println("调用次数 - " + countOfCall);
if (complexTypes.containsKey(elementTypeName)) {
// 获取指定名称的complexType节点
Element complexType = complexTypes.get(elementTypeName);
//获取指定complexType节点的element元素
Elements elements = complexType.getElementsByTag("xsd:element");
Iterator<Element> ie = elements.iterator();
while (ie.hasNext()) {
Element element = ie.next();
String eleTypeName = prefixHandle(element.attr("type"));
String nodeName = element.attr("name");
boolean containsKey = complexTypes.containsKey(eleTypeName);
//此判断只是控制Console输出格式
if(containsKey){
System.out.println(tabGenerator(countOfCall) + "<soa:" + nodeName + ">");
}else{
System.out.print(tabGenerator(countOfCall) + "<soa:" + nodeName + ">");
}
if (containsKey) {
countOfCall += 1;
getElement(complexTypes, eleTypeName, countOfCall);
}
//此判断只是控制Console输出格式
if (!containsKey) {
System.out.print("?"); //如果没有子节点的element元素,就加上'问号'
System.out.println("</soa:" + nodeName + ">");
}else{
System.out.println(tabGenerator(countOfCall - 1) + "</soa:" + nodeName + ">");
}
}
} else {
System.out.println("节点异常(不同寻常...),请检查wsdl地址或使用soap测试工具检查!");
}
}
// 获取请求、响应报文根节点
public static Map<String, String> getRootElemnts(Document document) {
// 使用Map保存根节点元素的name及其属性值
Map<String, String> rootElement = new HashMap<>();
// 通过元素标签名获取types元素,返回的是Elements集合(Elements可直接当作集合使用)
Elements e = document.getElementsByTag("wsdl:types");
// 一般情况,wsdl下只有一个types元素节点
Element typesNode = e.get(0);
// 一般情况,type下只有一个schema元素子节点
Element schema = typesNode.child(0);
// 把schema下的所有complexType获取出来,保存至Elements集合(Elements可直接当作集合使用)
// schemaChilds中有7个子元素:其中包括5个complexType、2个element(2个element就是要拿的element节点)
Elements schemaChilds = schema.children();
// System.out.println(schemaChilds.size());
Iterator<Element> iter = schemaChilds.iterator();//集合遍历
String requestElemnt = "";
String responseElemnt = "";
while (iter.hasNext()) {
Element child = iter.next();
//通过nodeName()方法获取元素节点name属性值
if (child.nodeName().contains("element")) { // 通过element关键字来判断child元素是否element元素
// 请求报文根节点
if (child.attr("type").contains("Request") || child.attr("type").contains("request")) {
requestElemnt = prefixHandle(child.attr("type"));// 前缀处理
}
// 响应报文根节点
if (child.attr("type").contains("Response") || child.attr("type").contains("response")) {
responseElemnt = prefixHandle(child.attr("type"));// 前缀处理
}
}
}
rootElement.put("requestElemnt", requestElemnt);
rootElement.put("responseElemnt", responseElemnt);
return rootElement;
}
// 获取所有的<xsd:complexType>元素节点
public static Map<String, Element> getAllComplexType(Document document) {
// complexType用于保存:complexType元素的name属性值及对应的complexType元素
Map<String, Element> complexType = new HashMap<>();
//通过complexType的标签名获取所有的complexType元素
Elements complexEle = document.getElementsByTag("xsd:complexType");
Iterator<Element> it = complexEle.iterator();
while (it.hasNext()) {
Element complexNode = it.next();
complexType.put(complexNode.attr("name"), complexNode);
}
return complexType;
}
private static String prefixHandle(String typeName) {
if (typeName.contains(":")) {
int a = typeName.indexOf(":");
typeName = typeName.substring(a + 1);
}
return typeName;
}
//生成tab标识符,用于控制输出格式--不是重点!!
private static String tabGenerator(int count){
String tabStr = "";
if(count < 1)
return tabStr;
for (int i = 0; i < count; i++)
tabStr += "\t";
return tabStr;
}
}
4.所解析的WSDL文档
说明:将其复制到项目的resources文件夹下,若无该文件夹,则创建一个新的。然后命名为:WSDL_XSD_Schema_Test.xml
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soa="http://soa.csg.cn"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
targetNamespace="http://soa.csg.cn" name="adbc">
<wsdl:types>
<xsd:schema xmlns:soa="http://soa.csg.cn"
attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://soa.csg.cn">
<xsd:complexType name="SyncUserResponse">
<xsd:sequence>
<xsd:element name="replyCode" minOccurs="0" maxOccurs="1"
type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="iscExtProperty">
<xsd:sequence>
<xsd:element name="name" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="value" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="description" minOccurs="0"
maxOccurs="1" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SyncUserPack">
<xsd:sequence>
<xsd:element name="sequence" minOccurs="0" maxOccurs="1"
type="xsd:long" />
<xsd:element name="entityType" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="entities" minOccurs="0" maxOccurs="unbounded"
type="soa:SyncUserEntities" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SyncUserEntities">
<xsd:sequence>
<xsd:element name="operate" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="extProperties" minOccurs="0"
maxOccurs="unbounded" type="soa:iscExtProperty" />
<xsd:element name="userId" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="loginName" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="attAccount" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="realName" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="userStatus" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="bizOrgId" minOccurs="0" maxOccurs="1"
type="xsd:string" />
<xsd:element name="gender" minOccurs="0" maxOccurs="1"
type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SyncUserRequest">
<xsd:sequence>
<xsd:element name="syncPack" minOccurs="0" maxOccurs="1"
type="soa:SyncUserPack" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="syncUserRequest" type="soa:SyncUserRequest" />
<xsd:element name="syncUserResponse" type="soa:SyncUserResponse" />
</xsd:schema>
</wsdl:types>
<wsdl:message name="syncUserHeader"></wsdl:message>
<wsdl:message name="syncUserRequest">
<wsdl:part name="syncUserRequest" element="soa:syncUserRequest" />
</wsdl:message>
<wsdl:message name="syncUserResponse">
<wsdl:part name="syncUserResponse" element="soa:syncUserResponse" />
</wsdl:message>
<wsdl:portType name="SOAServicePort">
<wsdl:operation name="syncUser">
<wsdl:input message="soa:syncUserRequest" />
<wsdl:output message="soa:syncUserResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SOAServiceBinding" type="soa:SOAServicePort">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="syncUser">
<soap:operation style="document" soapAction="" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="adbc">
<wsdl:port name="SOAService" binding="soa:SOAServiceBinding">
<soap:address
location="http://localhost" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
5.解析运行结果
如下图所示:请求报文解析成功;运行结果还有个小缺陷,不过不影响主体功能。