将xsd导入wsdl

IUn*_*own 28 xsd wsdl web-services wsdl2java

这是我目前的配置:

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

不知怎的,它似乎是wsdl和xsd导入之间的冲突 - 但我无法解决它.帮助是值得赞赏的.

Pet*_*dea 25

你有几个问题.

首先,XSD存在一个问题,即一个元素都被命名或引用; 在你的情况下应该参考.

更改:

<xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/> 
Run Code Online (Sandbox Code Playgroud)

至:

<xsd:element name="stock" type="Stock" minOccurs="1" maxOccurs="unbounded"/> 
Run Code Online (Sandbox Code Playgroud)

和:

  • 删除全局元素的声明 Stock
  • 为名为的类型创建复杂类型声明 Stock

所以:

<xsd:element name="Stock">
    <xsd:complexType>
Run Code Online (Sandbox Code Playgroud)

至:

<xsd:complexType name="Stock">
Run Code Online (Sandbox Code Playgroud)

确保修复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>
Run Code Online (Sandbox Code Playgroud)

正确:

<?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>
Run Code Online (Sandbox Code Playgroud)

某些处理器可能支持这两种语法.您发布的XSD显示问题,请确保您首先验证XSD.

如果你在WSDL创作方面采用WS-I方式会更好.

其他问题可能与在查找外部内容时使用相对URI和绝对URI有关.


Wit*_*eld 11

导入与包含

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

另一个令人困惑的地方是如何指定所包含.xsd文件的位置或路径:XSD import语句具有一个可选的属性,schemaLocation如果 import语句的命名空间位于同一位置(在同一文件中),则不需要import语句本身.

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

WSDL:

xs:import namespace="urn:listing3" schemaLocation="listing3.xsd"/>
Run Code Online (Sandbox Code Playgroud)

XSD:

<xsd:schema targetNamespace="urn:listing3"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
Run Code Online (Sandbox Code Playgroud)

另一种让我们知道关于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>
Run Code Online (Sandbox Code Playgroud)

您可以在这篇精彩的IBM文章中阅读更多相关内容.它有拼写错误,xsd:import而不是xs:import其他它没关系.

  • 该链接现在不指向右侧页面. (4认同)