重新定义xsd元素抛出"没有良好形成"错误

时间:2015-03-03 22:52:50

标签: soap xsd wsdl soapui w3c

我正在尝试在我的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>

3 个答案:

答案 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目录,是否仍会出现这种情况?