Я пытаюсь использовать элемент redefine в моем xsd. Я пробовал разные комбинации, но, похоже, не решил эту ошибку. Ошибка появляется, когда я пытаюсь загрузить WSDL, включая переопределенную схему, в интерфейс SOAP. Кроме того, он не отображается в дизайне для xsd в eclipse.redefine xsd element throws «неправильно сформированная» ошибка
WSDL -> Импорт TestService.xsd -> Импорт CreateTest.xsd -> Содержит определение CreateTestRequestType.
Когда я загружаю это в свой SOAPUI, все выглядит хорошо и без ошибок.
Теперь я пытаюсь переопределить тип CreateTestRequestType в другой XSD называется CreateRedefineTest.xsd и импортировать XSD в TestService.xsd (Оператор импорта comemented, но я обязательно только раскомментировать этот импорт и прокомментировать другой для тестирования). Но когда я загрузить 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
\t xmlns:test="http://test.com/TESTServices/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
\t xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
\t xmlns:tes="http://test.com/TestService/Test/"
\t name="TestService"
\t targetNamespace="http://test.com/TESTServices/">
\t <wsdl:types>
\t \t <xsd:schema targetNamespace="http://test.com/TestService/Test/">
\t \t \t <xsd:include schemaLocation="TestService.xsd" />
\t \t </xsd:schema>
\t </wsdl:types>
\t
\t <!-- Create Test -->
\t <wsdl:message name="CreateTestRequest">
\t \t <wsdl:part element="tes:CreateTestRequest" name="parameters" />
\t </wsdl:message>
\t <wsdl:message name="CreateTestResponse">
\t \t <wsdl:part element="tes:CreateTestResponse" name="parameters" />
\t </wsdl:message>
\t <wsdl:message name="TESTHeader">
\t \t <wsdl:part name="request_header" element="tes:testHeader"/>
\t </wsdl:message>
\t <wsdl:message name="TestFault">
\t \t <wsdl:part name="testFault" element="tes:testFault"></wsdl:part>
\t </wsdl:message>
\t <wsdl:portType name="TestServices_v4_0">
\t \t <!-- Create Party -->
\t \t <wsdl:operation name="CreateTest">
\t \t \t <wsdl:input message="test:CreateTestRequest" />
\t \t \t <wsdl:output message="test:CreateTestResponse" />
\t \t \t <wsdl:fault name="fault" message="test:TestFault"></wsdl:fault>
\t \t </wsdl:operation>
\t </wsdl:portType>
\t <wsdl:binding name="TestServicesSOAP_v4_0" type="test:TestServices_v4_0">
\t \t <soap:binding style="document"
\t \t \t transport="http://schemas.xmlsoap.org/soap/http" />
\t \t
\t \t <!-- Create Party -->
\t \t <wsdl:operation name="CreateTest">
\t \t \t <soap:operation soapAction="http://firstniagara.com/PartyService/CreateTest" />
\t \t \t <wsdl:input>
\t \t \t \t <soap:header message="test:TESTHeader" part="request_header"
\t \t \t \t \t use="literal" />
\t \t \t \t <soap:body use="literal" />
\t \t \t </wsdl:input>
\t \t \t <wsdl:output>
\t \t \t \t <soap:header message="test:TESTHeader" part="request_header"
\t \t \t \t \t use="literal" />
\t \t \t \t <soap:body use="literal" />
\t \t \t \t
\t \t \t </wsdl:output>
\t \t \t <wsdl:fault name="fault">
\t \t \t \t <soap:fault name="fault" use="literal" />
\t \t \t </wsdl:fault>
\t \t </wsdl:operation>
\t </wsdl:binding>
\t <wsdl:service name="TestServices_v4_0">
\t \t <wsdl:port binding="test:TestServicesSOAP_v4_0" name="TestServicesSOAP">
\t \t \t <soap:address location="http://localhost/TEST/ESB" />
\t \t </wsdl:port>
\t </wsdl:service>
</wsdl:definitions>
Это WSDL Импорт TestService.xsd, который содержит код ниже:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
\t xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
\t xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
\t xmlns:ct="http://test.com/TestService/CreateTest/"
\t targetNamespace="http://test.com/TestService/Test/"
\t elementFormDefault="qualified">
\t <xsd:import namespace="http://test.com/TestService/CreateTest/" schemaLocation="CreateTest.xsd" />
<!-- \t <xsd:import namespace="http://test.com/TestService/CreateTest/" schemaLocation="CreateRedefineTest.xsd" /> -->
\t
\t <!-- CreateParty -->
\t <xsd:element name="CreateTestRequest" type="ct:CreateTestRequestType" />
\t <xsd:element name="CreateTestResponse" type="ct:CreateTestResponseType" />
\t <xsd:element name="testHeader" type="xsd:string" />
\t <xsd:element name="testFault" type="xsd:string" />
\t
\t
\t
</xsd:schema>
TestService.xsd содержит CreateTest.xsd, который содержит код, приведенный ниже, и имеет тип CreateTestRequestType определено:
<xsd:schema
\t xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
\t xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
\t targetNamespace="http://test.com/TestService/CreateTest/"
\t elementFormDefault="qualified">
\t
\t <!-- Create Test-->
\t <xsd:complexType name="CreateTestRequestType">
\t \t <xsd:sequence>
\t \t \t <xsd:element name="RequestId" type="xsd:string" minOccurs="1"/>
\t \t \t <xsd:element name="TestRecord" type="xsd:string" minOccurs="1" />
\t \t </xsd:sequence>
\t </xsd:complexType>
\t <xsd:complexType name="CreateTestResponseType">
\t \t <xsd:sequence>
\t \t \t <xsd:element name="RequestId" type="xsd:string" minOccurs="1"/>
\t \t \t <xsd:element name="Messages" type="xsd:string" minOccurs="0"/>
\t \t \t <xsd:element name="TestIdentifier" type="xsd:string" minOccurs="0"/> \t \t \t
\t \t </xsd:sequence>
\t </xsd:complexType>
\t
</xsd:schema>
Попытка переопределить CreateTestRequ estType в CreateRedefineTest.XSD, как показано ниже:
<xsd:schema
\t xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
\t xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
\t xmlns:cp="http://test.com/TestService/CreateTest/"
\t targetNamespace="http://test.com/TestService/CreateTest/"
\t elementFormDefault="qualified">
\t
<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> \t
</xsd:schema>
Я не знаю, есть ли какая-либо ошибка в XMLBeans (это среда, которую SOAPUI использует для загрузки WSDL и xsds) с ''. Дело в том, что если я использую абсолютный путь для 'schemaLocation' в' xs: redefine', используя следующий файл примечания: /// C:/Path_to_xsd', кажется, что неважно, что WSDL загружается. Однако тогда, когда я создаю запрос и вручную добавляю новый элемент '', и я проверяю запрос с помощью SOAPUI, он говорит, что элемент не разрешен. Таким образом, полный путь wsdl загружается без ошибок, но загружается неправильно ... надеюсь, вам повезет найти решение. –
albciff
@albciff, Спасибо, что посмотрели на это и попытались. Я попытался использовать абсолютный путь, и он работает и загружается с ожидаемыми элементами и проверяет ОК. Я использовал «/» вместо «\», и он работал нормально. Теперь мне нужно выяснить, как заставить его работать, используя относительный путь. Большое спасибо за это! – mandy
здорово, что мой комментарий поможет вам: – albciff