如何用Eclipse API 提供的 org.eclipse.wst.wsdl 去解析读取WSDL文件?

原创 2014年11月19日 13:57:58

相对来说,Eclipse API的中文资料比较少,但是Eclipse的API提供了非常多的,非常强大的功能。

比如,eclipse的Eclipse API 提供的 org.eclipse.wst.wsdl包,里面提供了很多的类去解析WSDL文件。

总体来说,其提供的API简单易懂,而且其API是和专业术语对应起来的,比如,

一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。
这些元素嵌套在definitions元素中,
(1) Definitions是WSDL文档的根元素。对应于这个类: org.eclipse.wst.wsdl.Definition 其他的对象都可以通过这个对象获得
(2) Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
(3) Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。 
(4) PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
 (子节点) Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
(5) Binding - 特定端口类型的具体协议和数据格式规范的绑定。
(6) Service- 相关服务访问点的集合。

(子节点) Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。

下面是代码实例:

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.wsdl.Message;
import javax.wsdl.Part;
import javax.wsdl.PortType;
import javax.xml.namespace.QName;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Types;
import org.eclipse.wst.wsdl.internal.impl.PartImpl;
import org.eclipse.wst.wsdl.internal.util.WSDLResourceFactoryImpl;
import org.eclipse.wst.wsdl.util.WSDLResourceImpl;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.util.XSDResourceImpl;
import org.junit.Test;
import org.junit.Before;

public class WSDLParserWithEclipse {
	Definition definition=null;
	String wsdlPathString="E:/HelloEclipse-EMF-WSDL-XSD/test.wsdl";
	
	@Before
	public void setup(){
		ResourceSet resourceSet = new ResourceSetImpl();
		Resource.Factory.Registry registry = resourceSet.getResourceFactoryRegistry();
		Map extensionToFactoryMap = registry.getExtensionToFactoryMap();
		extensionToFactoryMap.put("wsdl", new WSDLResourceFactoryImpl());
		File wsdlFile =new File(wsdlPathString);  
		URI uri = URI.createFileURI(wsdlFile.getAbsolutePath());
		// You can avoid this cast, but will have to cast anyway later to get the Definition out the resource contents
		WSDLResourceImpl wsdlResource = (WSDLResourceImpl) resourceSet.createResource(uri);
		try {
			wsdlResource.load(null);
			definition = wsdlResource.getDefinition();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
    @Test
    public void testTypes(){
    	Types types = definition.getETypes();
    	List schemas = types.getSchemas("http://www.xxxxx.com/problem");
		XSDSchema schema = (XSDSchema) schemas.get(0);
    	org.eclipse.xsd.util.XSDResourceImpl.serialize(System.out, schema.getElement());
    }
    
    @Test 
    public void testMessage(){
    	Map messages=definition.getMessages();
    	System.out.println("The message size is:"+messages.size());
    	Set setMessages=messages.keySet();
		Iterator iteratorMessages=setMessages.iterator();
		while(iteratorMessages.hasNext()){
			QName key=(QName)iteratorMessages.next();
			Message message=(Message)messages.get(key);
			//{http://www.xxxxx.com/problem}getKeysSoapIn
			//System.out.println("Message Name:"+message.getQName());
			if(message.getQName().toString().indexOf("getKeysSoapIn")>0){
				System.out.println("Message Name:"+message.getQName());
				Map partsMap=message.getParts();
				//org.eclipse.xsd.impl.XSDElementDeclarationImpl
				System.out.println("Message Part size for getKeysSoapIn message is:"+partsMap.size());
				PartImpl part= (PartImpl)partsMap.get("problem");
				XSDElementDeclaration xsdElementDeclaration=part.getElementDeclaration();
				XSDResourceImpl.serialize(System.out, xsdElementDeclaration.getElement());
			}		
		}
    }
    @Test 
    public void testPortType(){
    	Map portTypes=definition.getPortTypes();
		System.out.println("Port Type size:"+portTypes.size());
		if(portTypes!=null&&portTypes.size()>0){
			Set set=portTypes.keySet();
			Iterator iterator=set.iterator();
			while(iterator.hasNext()){
				QName object=(QName)iterator.next();
				PortType portType=(PortType)portTypes.get(object);
				System.out.println("Port Type name:"+portType.getQName());
				org.eclipse.xsd.util.XSDResourceImpl.serialize(System.out, portType.getDocumentationElement());
			}
		}
    }
	

}



版权声明:本文为博主原创文章,未经博主允许不得转载。

eclipse-关于org.eclipse.wst.server.core

此文件夹位于workspace\.metadata\.plugins中,通过eclipse启动tomcat运行工程时,eclipse会将工程发布到org.eclipse.wst.server.core...

eclipse maven导入项目,报org.eclipse.wst.validation" has been removed

这个问题,在网上找了一下,搜出来的大都是同一篇内容,有一个网友说,只要去删除 ..\workspace\.metadata\.plugins\org.eclipse.core.runtime\.se...

Java之美[从菜鸟到高手演变]之eclipse的使用、优化配置

工欲善其事,必先利其器作者:egg邮箱:xtfggef@gmail.com微博:http://weibo.com/xtfggef博客:http://blog.csdn.net/zhangerqing(...

Eclipse的Deployment Assembly和Project Facets和org.eclipse.wst.common.project.facet.core.xml关系

背景: web项目:spring4+springmvc4+hibernate4+maven3 问题: 启动tomcat后报错:java.lang.ClassNotFoundExcepti...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

[Webservice] Eclipse根据wsdl文件自动生成webservice的调用客户端

公共接口:可供测试的在线webservice 生成客户端: 1. 带有webservice插件的Eclipse工具; 2. 首先用浏览器访问webservice的站点,接着保存打开的页面后缀为wsd...

【Webservice】 Eclipse根据wsdl文件自动生成webservice的调用客户端

公共接口:可供测试的在线webservice 生成客户端: 1. 带有webservice插件的Eclipse工具; 2. 首先用浏览器访问webservice的站点,接着保存打开的...
  • hj7jay
  • hj7jay
  • 2017年06月16日 09:36
  • 952

Eclipse根据wsdl文件生成webService(cxf)客户端(二)

cxf webservice服务端:http://blog.csdn.net/huzheaccp/article/details/8742803 cxf webservice服务端:http://b...

在Eclipse中使用Axis2插件自动生成WSDL文件

JDK版本:1.7update65 Eclipse版本:3.7.2

在Eclipse中使用Axis2插件自动生成WSDL文件

JDK版本:1.7update65 Eclipse版本:Juno Service Release 2(4.2.2) 首先在Eclipse中安装Axis2的插件: 1,下载Axis2插件,最新版本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用Eclipse API 提供的 org.eclipse.wst.wsdl 去解析读取WSDL文件?
举报原因:
原因补充:

(最多只允许输入30个字)