gpt4 book ai didi

java - 自动将内联 XSD 从 WSDL 提取到 XSD 文件中

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:12 24 4
gpt4 key购买 nike

我正在使用第三方 Web 服务,其定义和实现超出我的控制范围。此 Web 服务将来会发生变化。

Web 服务应该用于生成一个 XML 文件,其中包含一些与 Web 服务相同的数据(由相同的 XSD 类型表示)以及程序生成的一些额外信息。

我的方法:

  1. 创建我自己的 XSD,引用被调用 Web 服务的 WSDL 的 XSD 定义(这个 XSD 显然还包括额外信息的 XSD 类型。)
  2. 使用 Java XML 数据绑定(bind)框架(如 ADB 或 JiXB)从第 1 步中我自己的 XSD 文件生成数据绑定(bind)类
  3. 使用具有相同数据绑定(bind)框架的 Java SOAP 框架(如 Axis2 或 CXF)从 WSDL 生成数据绑定(bind)类(这将使我能够在生成 XML 时直接使用 Web 服务检索的对象。)

我将在自己的 XSD 文件中使用但在 WSDL 中定义的 XSD 类型可能会发生变化。每当它们发生变化时,我想再次自动处理 XSD 和 WSDL 数据绑定(bind)。 (如果变化足够大,这可能会触发一些开发工作。(但通常不会。))

我的问题:

在第 1 步中,我需要一个引用与 Web 服务使用的相同类型的 XSD。

WSDL 指的是另一个 WSDL,后者指的是另一个 WSDL 等等。最终有一个 WSDL 具有所需的内联 XSD 类型。据我所知,没有办法直接从 XSD 引用 WSDL 的内联 XSD 类型。

我认为最可行的方法是在自动处理(数据绑定(bind)之前)中包含一个额外步骤,将内联 XSD 从 WSDL 提取到其他 XSD 文件中。然后我自己的 XSD 文件可以引用这些其他 XSD 文件。

我想避免的事情:

  • 手动将内联 XSD 复制粘贴到 XSD 文件中(我正在寻找自动过程。)
  • 任何手动步骤。(例如手动确定包含内联类型的 WSDL。(该 WSDL 的位置也会发生变化。))
  • 在我自己的 XSD 中使用 xsd:any。我希望我自己的 XSD 文件是正确的。
  • 使用非 Java 技术(如 .NET)
  • 大量的实现(但无论如何都欢迎提示您将如何实现这种提取)

PS:我发现了一些类似的问题,但他们的回答都是这样的:WTH would you want to do that?这就是我相当大的背景故事的原因。

最佳答案

我不知道有任何库可以为您执行此操作,但绝对可以通过一些努力(约 200 行)来实现。生成所有内联和包含的 XSD 的粗略元程序:

method processWSDL(Document wsdl) {
for each ("/wsdl:definitions/wsdl:types/xsd:schema" in wsdl) {
call processXSD("inline_[i].xsd",".")
}
for each ("/wsdl:definitions/wsdl:import" in wsdl) {
Document x = read and parse ("@location")
if (x is WSDL) call processWSDL(x)
else if (x is XSD) call processXSD("@location", x)
}
}

method processXSD(String filename, Document xsd) {
write "xsd" to a new file "filename" // if 'filename' is a URL, take only the part after the last '/'
for each ("/xsd:schema/xsd:import" or "/xsd:schema/xsd:include" in xsd) {
if ("@schemaLocation" is local reference) { // no 'http://' prefix
Document x = read and parse ("@schemaLocation")
call processXSD("@schemaLocation", x)
}
}
}

这不是一个完整的解决方案,例如不处理在内联模式之外定义的命名空间前缀,但希望能提供一个良好的起点。

关于java - 自动将内联 XSD 从 WSDL 提取到 XSD 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2521008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com