导入XSD转换为WSDL(Importing xsd into wsdl)

2019-06-27 08:43发布

这是我目前的配置:

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 =“股票”被改变为type =“股票”,中的WSDL2Java开始给类型{http://stock.com/schemas/services/stock}Stock被引用但没有定义。

不知怎的,似乎WSDL和XSD进口之间的冲突 - 但我只是不能化解it.Help表示赞赏。

Answer 1:

你有几个问题在这里。

首先,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正确的方法是使用XSD模式与进口/包括一个wsdl内:types元素。 WSDL:进口被保留到引用其他WSDL文件。 更多信息可通过该WS-I规范,部分去WSDL和Schema导入 。 基于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。

如果你去了WS-I的方式,当它涉及到WSDL创作这将是更好的。

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



Answer 2:

进口与包括

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

混乱的另一个领域是如何指定包括位置或路径.xsd文件:一个XSD import语句有一个可选的属性命名schemaLocation在同一个如果 import语句的命名空间是在相同的位置,没有必要(文件)作为导入语句本身。

当你选择使用一个外部.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"> 

另一种方法来让知道WSDL有关XSD是基于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但除此之外,它的罚款。



文章来源: Importing xsd into wsdl