我正在尝试在我的xsd中使用元素重新定义。我尝试过不同的组合,但似乎仍未解决此错误。当我尝试将包含重新定义的模式的WSDL加载到SOAP UI时,会出现错误。此外,它没有出现在eclipse中的xsd设计中。
WSDL - > Imports TestService.xsd - >导入CreateTest.xsd - >包含CreateTestRequestType的定义。
当我将它加载到我的SOAPUI中时,一切看起来都很好而且没有错误。
现在,我正在尝试在另一个名为 CreateRedefineTest.xsd 的xsd中重新定义 CreateTestRequestType 类型并导入这个xsd进入TestService.xsd(导入语句已经发布,但我必须取消注释这个导入并评论另一个用于测试)。但是当我将WSDL加载到SOAP UI中时,我得到以下错误:
Source: null Error: URL "CreateTest.xsd" is not well-formed
EDIT1: 我可以通过提供绝对路径来解决此错误。是否有可能使它与相对路径一起工作?
EDIT2 我查看了有关此元素的w3文章,该示例确实使用了相对路径。但我试图复制,但它仍然无法正常工作。该示例可在此location处获得。
我想我错过了一些规则,但我尝试过多种方法,似乎无法解决这个问题。
以下是WSDL和XSD的源代码。
WSDL:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions
xmlns:test="http://test.com/TESTServices/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tes="http://test.com/TestService/Test/"
name="TestService"
targetNamespace="http://test.com/TESTServices/">
<wsdl:types>
<xsd:schema targetNamespace="http://test.com/TestService/Test/">
<xsd:include schemaLocation="TestService.xsd" />
</xsd:schema>
</wsdl:types>
<!-- Create Test -->
<wsdl:message name="CreateTestRequest">
<wsdl:part element="tes:CreateTestRequest" name="parameters" />
</wsdl:message>
<wsdl:message name="CreateTestResponse">
<wsdl:part element="tes:CreateTestResponse" name="parameters" />
</wsdl:message>
<wsdl:message name="TESTHeader">
<wsdl:part name="request_header" element="tes:testHeader"/>
</wsdl:message>
<wsdl:message name="TestFault">
<wsdl:part name="testFault" element="tes:testFault"></wsdl:part>
</wsdl:message>
<wsdl:portType name="TestServices_v4_0">
<!-- Create Party -->
<wsdl:operation name="CreateTest">
<wsdl:input message="test:CreateTestRequest" />
<wsdl:output message="test:CreateTestResponse" />
<wsdl:fault name="fault" message="test:TestFault"></wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestServicesSOAP_v4_0" type="test:TestServices_v4_0">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<!-- Create Party -->
<wsdl:operation name="CreateTest">
<soap:operation soapAction="http://firstniagara.com/PartyService/CreateTest" />
<wsdl:input>
<soap:header message="test:TESTHeader" part="request_header"
use="literal" />
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:header message="test:TESTHeader" part="request_header"
use="literal" />
<soap:body use="literal" />
</wsdl:output>
<wsdl:fault name="fault">
<soap:fault name="fault" use="literal" />
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestServices_v4_0">
<wsdl:port binding="test:TestServicesSOAP_v4_0" name="TestServicesSOAP">
<soap:address location="http://localhost/TEST/ESB" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
此WSDL导入 TestService.xsd ,其中包含以下代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ct="http://test.com/TestService/CreateTest/"
targetNamespace="http://test.com/TestService/Test/"
elementFormDefault="qualified">
<xsd:import namespace="http://test.com/TestService/CreateTest/" schemaLocation="CreateTest.xsd" />
<!-- <xsd:import namespace="http://test.com/TestService/CreateTest/" schemaLocation="CreateRedefineTest.xsd" /> -->
<!-- CreateParty -->
<xsd:element name="CreateTestRequest" type="ct:CreateTestRequestType" />
<xsd:element name="CreateTestResponse" type="ct:CreateTestResponseType" />
<xsd:element name="testHeader" type="xsd:string" />
<xsd:element name="testFault" type="xsd:string" />
</xsd:schema>
TestService.xsd 包含 CreateTest.xsd ,其中包含以下代码且类型为 CreateTestRequestType 已定义:
<xsd:schema
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://test.com/TestService/CreateTest/"
elementFormDefault="qualified">
<!-- Create Test-->
<xsd:complexType name="CreateTestRequestType">
<xsd:sequence>
<xsd:element name="RequestId" type="xsd:string" minOccurs="1"/>
<xsd:element name="TestRecord" type="xsd:string" minOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="CreateTestResponseType">
<xsd:sequence>
<xsd:element name="RequestId" type="xsd:string" minOccurs="1"/>
<xsd:element name="Messages" type="xsd:string" minOccurs="0"/>
<xsd:element name="TestIdentifier" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
尝试在CreateRedefineTest.xsd中重新定义 CreateTestRequestType ,如下所示:
<xsd:schema
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:cp="http://test.com/TestService/CreateTest/"
targetNamespace="http://test.com/TestService/CreateTest/"
elementFormDefault="qualified">
<xsd:redefine schemaLocation="CreateTest.xsd">
<xsd:complexType name="CreateTestRequestType">
<xsd:complexContent>
<xsd:extension base="cp:CreateTestRequestType">
<xsd:sequence>
<xsd:element name="country" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:redefine>
</xsd:schema>
答案 0 :(得分:1)
SoapUI是一个很棒的工具,它帮助我度过了难关,并将在未来继续以很好的方式帮助我。
我认为这是显然很多用户不使用的功能之一,似乎是SoapUI 5.0.0中的一个错误。我在几个旧版本的SoapUI中尝试了同样的事情并获得了相同的结果。我也在SOAP UI NG Pro 1.2.2的试用版中尝试过它。
然后我在XMLSpy中尝试了这个,它没有任何错误,完全相同的xsd没有修改。 (注意:TestService.xsd需要Redefined.xsd的注释import语句)
我还发现有一个错误报告,但没有找到解决方案或有关解决方案的任何意见。如果有人想要这些错误的引用,location。如果您愿意,可以查找相关的错误651,586和539。
我希望在某些时候这个bug在SoapUI中得到修复。 我还创建了一个新bug来引用这些旧bug并合并:SourceForge 671
希望这篇文章能够在遇到同样的问题时节省其他时间。
感谢所有看过这篇文章的人。
答案 1 :(得分:1)
我想确认在尝试在我的消息集中使用版本5.0.0的SOAP UI中的xsd:redefine元素时,我得到了同样的错误。
基本上,我必须扩展另一个由开放地理空间组 - Web要素服务定义的消息集的消息定义,并在我的WSDL的请求和响应定义中使用重新定义的模式。
除了“格式不正确”之外,&#39;错误,我也得到:
'Source: null Error: type 'QueryType@http://www.opengis.net/wfs' not found.'
Eclipse没有WSDL验证的问题,我可以毫无问题地将它导入Rational Service Tester(V8.5.0.2)。
答案 2 :(得分:0)
这可能是由于您的解析器无法找到“cp:http://test.com/TestService/CreateTest/”的架构文档。 如果您对cp xsd使用绝对URL,或使用XML目录,是否仍会出现这种情况?