如何用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自带的Axis1插件生成WSDL文件

JDK版本 Eclipse版本:Helios Service Release 2
  • a19881029
  • a19881029
  • 2014年04月28日 11:22
  • 16423

Wsdl文件读取方式

Wsdl文件读取方式 WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。 ...
  • G1248019684
  • G1248019684
  • 2016年05月10日 15:16
  • 1652

使用JDK自带的工具wsimport解析WSDL文件

使用JDK自带的命令wsimport解析WSDL文件。 wsimport -s D:\\src -p com.test -keep http://localhost/Service/WebS...
  • u010589185
  • u010589185
  • 2017年04月30日 11:27
  • 454

Eclipse根据wsdl文件自动生成webservice client图解,以及调用示例,附测试项目

以实际项目中遇到的部分为例 1.已知wsdl文件:SI_SD01302_GT2ERP_Syn_OutService.wsdl 2.在Eclipse中生成webservice客户端代码,New---...
  • han_huayi
  • han_huayi
  • 2017年08月31日 18:15
  • 467

webservice中的wsdl文件的剖析,已经swebservice客户端调用的几种方式

选自javaee技术体系中的webservice技术
  • fengchao2016
  • fengchao2016
  • 2016年10月22日 18:30
  • 3546

php5.3中webservice利用soap—WSDL文件解析-WSDL : 描述你的Web服务(转载)

WSDL : 描述你的Web服务 级别: 中级 柴晓路 (fennivel@uddi-china.org), Chief System Architect, 上海得易电子商务技术有...
  • neubuffer
  • neubuffer
  • 2013年11月23日 14:39
  • 1990

wsimport 带https协议wdsl 时报错的处理

最近用wsimport处理 带https协议wdsl 时报错: E:\Projects\Sample>wsimport -s ./src -verbose https://localhost:874...
  • Nuc_sun
  • Nuc_sun
  • 2016年12月30日 11:35
  • 2025

利用Eclipse开发WSDL类型的webservice以及发布过程

前提准备工作:     (1)下载tomcat--xampp集成环境---url:http://sourceforge.net/projects/xampp/?source=recommende...
  • u011300819
  • u011300819
  • 2017年05月24日 10:28
  • 747

CXF-04: CXF 的本质,解析 WSDL 文档

调用一次Web Service的本质: 1.客户端把调用方法参数,转换XML文档片段————该文档片段必须符合WSDL定义的格式; 2.通过网络,把XML文档片段传...
  • cheng_feng_xiao_zhan
  • cheng_feng_xiao_zhan
  • 2016年10月13日 01:09
  • 1175

onvif学习 SOAP WSDL

原文: http://wenku.baidu.com/view/f87b55f19e31433239689314.html WebServices简介 先给出一个概念 SO...
  • u013898698
  • u013898698
  • 2017年02月16日 10:26
  • 684
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用Eclipse API 提供的 org.eclipse.wst.wsdl 去解析读取WSDL文件?
举报原因:
原因补充:

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