将xsd导入wsdl

32

这是我的当前配置:

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://stock.com/schemas/services/stock"
    xmlns:tns="http://stock.com/schemas/services/stock"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified"  targetNamespace="http://stock.com/schemas/services/stock">

<xsd:element name="Stock">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="ticker" nillable="true" type="xsd:string"/>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="quotes" nillable="true" type="Quote"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:complexType name="Quote">
    ........
</xsd:complexType>
.......
<xsd:element name="gethighBetaStockResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

WSDL

<?xml version="1.0" encoding="UTF-8"?><definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
    .....xmlns:external="http://stock.com/schemas/services/stock"
<import namespace="http://stock.com/schemas/services/stock" location="Stock.xsd" />
<message name="getStockQuoteResp">
    <part name="parameters" element="external:getStockQuoteResponse" />
</message>

然而,当ref="Stock"被改为type="Stock"时,wsdl2java开始给出类型{http://stock.com/schemas/services/stock}Stock被引用但未定义的错误。

某种程度上,这似乎是wsdl和xsd导入之间的冲突 - 但我无法解决它。希望能得到帮助。

2个回答

29

你这里有几个问题。

首先,XSD存在一个问题,即元素同时被命名和引用;在你的情况下应该是被引用。

更改为:

<xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/> 

收件人:

<xsd:element name="stock" type="Stock" minOccurs="1" maxOccurs="unbounded"/> 

因此:

  • 删除全局元素Stock的声明
  • 创建一个名为Stock的类型的复杂类型声明
<xsd:element name="Stock">
    <xsd:complexType>

收件人:

<xsd:complexType name="Stock">

请确保修复XML的闭合标签。

第二个问题是正确引用外部XSD的方法是在wsdl:types元素中使用XSD模式来进行导入/包含。 wsdl:import是保留用于引用其他WSDL文件的。 可以通过查看WS-I规范的WSDL和模式导入一节获得更多信息。 基于WS-I,您的情况将是:

INCORRECT: (您所展示的方式)

<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
    .....xmlns:external="http://stock.com/schemas/services/stock"
    <import namespace="http://stock.com/schemas/services/stock" location="Stock.xsd" />
    <message name="getStockQuoteResp">
        <part name="parameters" element="external:getStockQuoteResponse" />
    </message>
</definitions>

正确的做法:

<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
    .....xmlns:external="http://stock.com/schemas/services/stock"
    <types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema">
            <import namespace="http://stock.com/schemas/services/stock" schemaLocation="Stock.xsd" />             
        </schema>
    </types>
    <message name="getStockQuoteResp">
        <part name="parameters" element="external:getStockQuoteResponse" />
    </message>
</definitions>

某些处理器可能支持两种语法。你发布的XSD存在问题,请确保你首先验证该XSD。

在编写WSDL时,最好采用WS-I方式。

其他问题可能与相对URI和绝对URI在定位外部内容方面的使用有关。


我需要让以下表单正常工作: <xsd:element name="stock" type="Stock" minOccurs="1" maxOccurs="unbounded"/> 将两者导入xsd和wsdl都没有帮助 <import namespace="http://stock.com/schemas/services/stock" location="Stock.xsd" /> <types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://stock.com/schemas/services/stock/wsdl"> <import namespace="http://stock.com/schemas/services/stock" schemaLocation="Stock.xsd"/> </schema> </types> - IUnknown
愚蠢的错误 - 但感谢您帮助找出差异。 - IUnknown

12

导入 vs 包含

导入(import)的主要目的是导入一个命名空间(namespace)。XSD 导入语句更常见的用法是从另一个文件中导入一个命名空间(namespace)。你可能从文件中获取命名空间信息,但不要忘记你正在导入的是命名空间(namespace),而不是文件(不要将 import 语句与 include 语句混淆)。

另一个令人困惑的地方是如何指定包含的 .xsd 文件的位置或路径:XSD 导入语句有一个可选属性名为 schemaLocation,但如果导入语句的命名空间(namespace)与导入语句本身在相同位置(同一文件)上,则不需要使用该属性。

当你选择使用外部的 .xsd 文件来编写你的 WSDL 时,schemaLocation 属性就变得必要了。非常确定你在导入语句中使用的命名空间(namespace)与你正在导入的模式(schema)的 targetNamespace 相同。也就是说,所有三个出现都必须完全相同:

WSDL:

xs:import namespace="urn:listing3" schemaLocation="listing3.xsd"/>

XSD:

<xsd:schema targetNamespace="urn:listing3"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

通过 Maven 的 pom.xml,让 WSDL 知道 XSD 的另一种方法:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>xmlbeans-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>generate-sources-xmlbeans</id>
      <phase>generate-sources</phase>
      <goals>
    <goal>xmlbeans</goal>
      </goals>
    </execution>
  </executions>
  <version>2.3.3</version>
  <inherited>true</inherited>
  <configuration>
    <schemaDirectory>${basedir}/src/main/xsd</schemaDirectory>
  </configuration>
</plugin>

您可以在这篇优秀的IBM文章中了解更多相关信息。它有一些打字错误,例如使用了xsd:import而不是xs:import,但除此之外它是好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接