30

这是我目前的配置:

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 导入之间似乎存在冲突-但我无法解决它。感谢您的帮助。

4

2 回答 2

27

你在这里有几个问题。

首先,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 元素中使用带有 import/include 的 XSD 模式。wsdl:import 保留用于引用其他 WSDL 文件。通过浏览 WS-I 规范,WSDL 和 Schema Import部分可以获得更多信息。基于 WS-I,您的情况将是:

错误:(你展示的方式)

<?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 有关。

于 2012-08-25T21:47:42.630 回答
11

导入与包含

导入的主要目的是导入命名空间。XSD 导入语句的更常见用途是导入出现在另一个文件中的命名空间。您可能正在从文件中收集名称空间信息,但不要忘记它是您正在导入的名称空间,而不是文件(不要将import语句与include语句混淆)。

另一个令人困惑的领域是如何指定包含.xsd文件的位置或路径:XSD 导入语句有一个名为的可选属性schemaLocation,但如果导入语句的名称空间与导入语句本身。

.xsd当您确实选择为您的 WSDL使用外部文件时,该schemaLocation属性就变得必要了。请确保您在 import 语句中使用的命名空间与您正在导入的架构的 targetNamespace 相同。也就是说,所有 3 次出现必须相同:

WSDL:

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

XSD:

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

另一种了解 XSD 的 WSDL 的方法是通过 Maven 的 pom.xml:

<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但其他都很好。

于 2013-10-01T17:22:15.590 回答