从 XSD 文件生成 WSDL
Posted
技术标签:
【中文标题】从 XSD 文件生成 WSDL【英文标题】:Generating a WSDL from an XSD file 【发布时间】:2010-10-29 12:54:06 【问题描述】:我需要生成一个给定 XSD 文件的 WSDL 文件。我该怎么做呢?我可以在 VS2005 中执行此操作吗?最简单的方法是什么?
【问题讨论】:
这可能会有所帮助:在 Eclipse 中使用 XSD 创建 WSDL helloworldpoc.wordpress.com/web-services/92-2 您是否从 XSD 创建了 WSDL? 【参考方案1】:您不能 - XSD 描述了 DATA 方面,例如Web 服务的 - WSDL 描述了 Web 服务的功能(方法调用)。您通常无法仅从数据中找出方法调用。
这些实际上是等式中两个独立的、独特的部分。为简单起见,您通常会将 XSD 定义导入到 <wsdl:types>
标记中的 WSDL。
(感谢 Cheeso 指出我对术语的不准确使用)
【讨论】:
嗨,马克!谢谢你澄清!我会回去做我的功课! Marc,您的意思是“将架构导入 wsdl:types”而不是“将 XSD 包含到 wsdl:Schema”? 两者都可以——你可以在 WSDL 中包含 XSD,也可以将 XSD 的内容复制并粘贴到 WSDL 中——两者都可以。 嗯,不。 wsdl:schema 不存在。元素是 wsdl:types。首选机制是 xsd:import,不是剪切和粘贴,也不是“包含”。如果“包含”是指“导入”,我建议您使用准确的术语。 是的,我知道这一点,Cheeso - 但有些脑残的开发环境无法处理 xsd:import 和类似的语句 - 在这种情况下,好的 ole cut&paste 可能最终会成为你的只有选项。这是一个选择 - 不是一个很好的选择,但如果你真的需要它,它就在那里。【参考方案2】:我想在这点上与 marc_s 有所不同,他写道:
XSD 描述了 DATA 方面,例如 Web 服务的 - WSDL 描述 网络服务的功能 (方法调用)。你通常不能 找出你的方法调用 仅数据。
WSDL 没有描述函数。 WSDL 定义了一个网络接口,它本身由端点组成,这些端点获取消息,然后有时会回复消息。 WSDL 描述端点以及请求和回复消息。它非常面向消息。
我们经常将 WSDL 视为一组函数,但这是因为 Web 服务工具通常会生成客户端代理,将 WSDL 操作公开为方法或函数调用。但 WSDL 并不要求这样做。这是工具的副作用。
编辑:此外,在一般情况下,XSD 不定义 Web 服务的数据方面。 XSD 定义了兼容的 XML 文档中可能存在的元素。这样的文档可以作为消息通过 Web 服务端点进行交换,但并非必须如此。
回到这个问题,我会以不同的方式回答最初的问题。我会说是的,可以在给定 xsd 文件的情况下生成 WSDL 文件,就像可以使用鸡蛋生成煎蛋卷一样。
编辑:我最初的回答不清楚。让我再尝试一次。我不建议 XSD 等同于 WSDL,也不建议 XSD 足以生成 WSDL。我确实说可以在给定 XSD 文件的情况下生成 WSDL,如果你的意思是“使用 XSD 文件生成 WSDL”的话。这样做,您将扩充 XSD 文件中的信息以生成 WSDL。您将需要定义额外的东西——消息部分、操作、端口类型——这些都不存在于 XSD 中。但是,通过一些创造性的努力,“在给定 XSD 的情况下生成 WSDL”是可能的。
如果短语“在给定 XSD 的情况下生成 WSDL”被用来暗示“将 XSD 机械地转换为 WSDL”,那么答案是否定的,您不能这样做。鉴于我对上面 WSDL 的描述,这一点应该很清楚。
使用 XSD 文件生成 WSDL 时,您通常会执行以下操作(请注意此过程中的创意步骤):
-
将 XML 模式导入 WSDL(wsdl:types 元素)
根据需要添加到类型或元素的集合以及附加的类型或包装器(比如数组或包含基本类型的结构)。 #1 和 #2 的结果包含 WSDL 将使用的所有类型。
根据之前定义的类型定义一组输入和输出消息(可能还有故障)。
定义一个端口类型,它是成对的 in.out 消息的集合。您可能会将 port-type 视为 Java 接口的 WSDL 模拟。
指定一个绑定,它实现端口类型并定义如何序列化消息。
指定实现绑定的服务。
大多数 WSDL 或多或少都是样板文件。它可能看起来令人生畏,但这主要是因为我发现那些可怕而丰富的尖括号。
有些人认为这是一个冗长的手动过程。可能是。但这就是构建可互操作服务的方式。您还可以使用工具来定义 WSDL。从代码动态生成 WSDL 将导致互操作陷阱。
【讨论】:
您将如何确定 SOAP 操作等?就凭数据?这充其量只是有点投机,不是吗? 您如何仅从您的 XSD 中知道哪个 wsdl:operation 将具有哪些 SOAP 错误等?您可能最多只能猜测..... 您如何仅从 XSD 中知道您将拥有哪种 SOAP 绑定? style=document 或 style=RPC ??? 如果你只有一个描述被传递数据的XSD,你怎么知道你的whatever-service的服务端点??? 冗长的手动编辑过程忘记了 .xsd 没有定义 WSDL 方法或 SOAP 绑定类型和其他参数。【参考方案3】:我知道这个问题很老,但值得回答。我个人更喜欢手动创建 WSDL 并使用 SoapUI 测试合规性。但有时(特别是对于复杂的 WSDL),您可以通过三种方式从 XSD 中生成一个:
-
Generating a WSDL from a schema using Eclipse (probably the most user-friendly)
Generating a WSDL via CXF (my favorite)
Generating a WSDL via conventions using Spring WS (my least favorite)
我更喜欢 CXF 方法,因为我是 CLI 专家。如果它有 CLI,你可以自动化(这是我的座右铭)。我最不喜欢 Spring WS 方法,因为它使用了很多特定于框架的约定。
了解 CXF 的人(我相信)比 Spring WS 还多。因此,任何可以为新工程师带来学习曲线(没有任何明显优势或投资回报率)的东西都是我不赞成的。
它还应该不说应该测试任何生成的 WSDL 的有效性和合规性(并进行调整直到它符合要求),并且您的应用程序发布一个静态 wsdl(而不是返回一个自动生成的)。
根据我的经验,您从一个符合 WS-I 的 wsdl 开始,然后您的应用程序会自动生成(并返回给消费者)一个不符合标准的 wsdl。
换句话说,当心自动魔法。
【讨论】:
【参考方案4】:这个工具xsd2wsdl 是 Apache CXF 项目的一部分,它将生成一个极简的 WSDL。
【讨论】:
【参考方案5】:就我个人而言(根据我所知道的,即 Java 和轴),我会从 .xsd 文件生成一个 Java 数据模型(Axis 2 可以做到这一点),然后添加一个接口来描述我的 Web 服务使用该模型,然后从该接口生成一个 WSDL。
因为 .NET 也具有所有这些功能,所以在那个生态系统中也必须能够做到这一切。
【讨论】:
天啊,听起来很圆。为什么不通过 xsd:import'ing 将 XSD 导入 wsdl:types 元素来生成 WSDL,然后从中生成 Java 或 .NET 接口?它被称为“WSDL-First 方法”,它提供了良好的互操作性。 因为您要定义 Web 服务的方法,而 .xsd 没有指定这些方法,因此您必须将方法手动编辑到您以您的方式生成的任何 .wsdl - 愚蠢的国际海事组织。【参考方案6】:我们可以从 xsd 生成 wsdl 文件,但您必须使用 eclipse (OEPE) 的 oracle 企业包。 只需创建 xsd 然后右键单击->新建->wsdl ...
【讨论】:
以上是关于从 XSD 文件生成 WSDL的主要内容,如果未能解决你的问题,请参考以下文章
BizTalk Web 参考 - 生成的 XSD 具有来自 WSDL 的“丢失”信息