Jsoup解析WSDL文档代码实例

   日期:2020-08-24     浏览:108    评论:0    
核心提示:系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例

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.解析运行结果

如下图所示:请求报文解析成功;运行结果还有个小缺陷,不过不影响主体功能。

总结

以上就是Jsoup解析WSDL的一个简单实例的内容了,注重理解方法原理,就可以解析所有的WSDL文档,若再深度研究一下,甚至可以开发出一款类似市面上的接口测试工具~
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服