【问题标题】:Importing xsd into wsdl将 xsd 导入 wsdl
【发布时间】:2012-08-20 16:16:52
【问题描述】:

这是我当前的配置:

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}股票被引用但未定义。

不知何故,wsdl 和 xsd 导入之间似乎存在冲突 - 但我无法解决它。感谢您的帮助。

【问题讨论】:

    标签: web-services xsd wsdl wsdl2java


    【解决方案1】:

    这里有几个问题。

    首先,XSD 存在一个元素既被命名又被引用的问题;在你的情况下应该被引用。

    变化:

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

    收件人:

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

    还有:

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

    所以:

    <xsd:element name="Stock">
        <xsd:complexType>
    

    收件人:

    <xsd:complexType name="Stock">
    

    确保您修复了 xml 结束标记。

    第二个问题是引用外部 XSD 的正确方法是在 wsdl:types 元素中使用带有 import/include 的 XSD 模式。 wsdl:import 保留用于引用其他 WSDL 文件。通过浏览 WS-I 规范,WSDL and 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 有关。

    【讨论】:

    • 我需要得到以下表格才能工作 同时导入 xsd 和 wsdl 不会help stock.com/schemas/services/stock" location="Stock.xsd" /> w3.org/2001/XMLSchema" targetNamespace="stock.com/schemas/services/stock/wsdl"> stock.com/schemas/services/stock" schemaLocation= "Stock.xsd"/>
    • 愚蠢的错误 - 但感谢您在识别差异方面的帮助。
    【解决方案2】:

    导入与包含

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

    另一个令人困惑的领域是如何指定包含的.xsd 文件的位置或路径:XSD 导入语句有一个名为schemaLocation 的可选属性,但 如果 命名空间不是必需的import 语句的位置与 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"> 
    

    另一种让 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>
    

    您可以在great IBM article 中了解更多信息。它有诸如xsd:import 而不是xs:import 之类的拼写错误,但其他都可以。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多