web-dev-qa-db-ja.com

xsdをwsdlにインポートする

これは私の現在の構成です:

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はType {http://stock.com/schemas/services/stock}Stockを参照しますが、定義しません。

どういうわけかwsdlインポートとxsdインポートの衝突のように見えますが、解決できません。

28
IUnknown

ここにはいくつかの問題があります。

まず、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終了タグを必ず修正してください。

2番目の問題は、外部XSDを参照する正しい方法は、wsdl:types要素内のimport/includeで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>

[〜#〜] some [〜#〜]プロセッサは両方の構文をサポートする場合があります。出したXSDには問題が表示されます。最初にXSDを検証してください。

WSDLのオーサリングに関しては、WS-Iの方が良いでしょう。

他の問題は、外部コンテンツの検索での相対URIと絶対URIの使用に関連する場合があります。

25
Petru Gardea

インポートとインクルード

インポートの主な目的は、namespaceをインポートすることです。 XSD importステートメントのより一般的な使用法は、別のファイルに表示されるnamespaceをインポートすることです。ファイルから名前空間情報を収集している可能性がありますが、インポートするのはnamespaceであることを忘れないでくださいファイルではありませんimportステートメントとincludeステートメントを混同しないでください)。

別の混乱領域は、含まれる.xsdファイルの場所またはパスの指定方法です。XSDインポートステートメントには、schemaLocationという名前のオプション属性がありますが、必須ではありませんifimportステートメントの名前空間は、importステートメント自体と同じ場所(同じファイル内)にあります。

WSDLに外部.xsdファイルを使用することを選択した場合、schemaLocation属性が必要になります。 importステートメントで使用するnamespaceは、インポートするスキーマの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などのタイプミスがありますが、それ以外は問題ありません。

11
Withheld