这是我目前的配置:
<?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>
<?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导入之间的冲突 - 但我无法解决它.Help非常感谢。
答案 0 :(得分:25)
这里有几个问题。
首先,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 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有关。
答案 1 :(得分:10)
导入与包含
导入的主要目的是导入命名空间。 XSD导入语句的更常见用法是导入出现在另一个文件中的名称空间。您可能正在从文件中收集命名空间信息,但不要忘记它是您要导入的命名空间,而不是文件(不要混淆{带有import
语句的{1}}语句。
另一个令人困惑的方面是如何指定包含的include
文件的位置或路径:XSD import语句有一个名为.xsd
的可选属性,但不一定是如果 import语句的名称空间与import语句本身位于同一位置(在同一文件中)。
当您选择为WSDL使用外部schemaLocation
文件时,.xsd
属性变得必要。请确保您在import语句中使用的名称空间与要导入的模式的targetNamespace相同。也就是说,所有3次出现必须相同:
<强> WSDL:强>
schemaLocation
<强> XSD:强>
xs:import namespace="urn:listing3" schemaLocation="listing3.xsd"/>
让我们知道关于XSD的WSDL的另一种方法是通过Maven的pom.xml:
<xsd:schema targetNamespace="urn:listing3"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
您可以在此great IBM article中详细了解相关内容。它有<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>
而不是xsd:import
的拼写错误,但除此之外没关系。