Как исправить soapenv: проблема с конвертом в схеме XSD при проверке с запросом / ответом SOAP
У меня есть SOAP-запрос:-
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://services.test.com/schema/MainData/V1">
<soapenv:Header/>
<soapenv:Body>
<v1:retrieveDataRequest>
<v1:Id>58</v1:Id>
</v1:retrieveDataRequest>
</soapenv:Body>
</soapenv:Envelope>
и SOAP-ответ:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<retrieveDataResponse xmlns="http://services.test.com/schema/MainData/V1">
<Response>The Data retrieved from the Database</Response>
<Id>58</Id>
<Name>fdfdf</Name>
<Age>44</Age>
<Designation>sse</Designation>
</retrieveDataResponse>
</soap:Body>
</soap:Envelope>
Теперь моя схема XSD:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://services.test.com/schema/MainData/V1"
xmlns:tns="http://services.test.com/schema/MainData/V1" elementFormDefault="qualified">
<complexType name="dataRequest">
<sequence>
<element name="Id" type="int"></element>
<element name="Name" type="string"></element>
<element name="Age" type="int"></element>
<element name="Designation" type="string"></element>
</sequence>
</complexType>
<complexType name="dataResponse">
<sequence>
<element name="Response" type="string"></element>
<element name="Id" type="int"></element>
<element name="Name" type="string"></element>
<element name="Age" type="int"></element>
<element name="Designation" type="string"></element>
</sequence>
</complexType>
<element name="insertDataRequest" type="tns:dataRequest"></element>
<element name="insertDataResponse" type="tns:dataResponse"></element>
<element name="retrieveDataRequest" type="tns:retrieveRequest"></element>
<element name="retrieveDataResponse" type="tns:dataResponse"></element>
<complexType name="retrieveRequest">
<sequence>
<element name="Id" type="int"></element>
</sequence>
</complexType>
<element name="updateDataRequest" type="tns:dataRequest"></element>
<element name="updateDataRespone" type="tns:dataResponse"></element>
<complexType name="deleteRequest">
<sequence>
<element name="ID" type="int"></element>
</sequence>
</complexType>
<element name="deleteDataRequest" type="tns:deleteRequest"></element>
<element name="deleteDataResponse" type="tns:dataResponse"></element>
</schema>
Теперь моя проблема заключается в том, что всякий раз, когда я пытаюсь проверить мой SOAP-запрос по этой схеме XSD, я получаю следующую ошибку:
Not valid.
Error - Line 1, 133: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 133; cvc-elt.1: Cannot find the declaration of element 'soapenv:Envelope'.
Пожалуйста, помогите... Мне нужно знать, что я должен изменить в своей схеме XSD, чтобы запрос / ответ SOAP был проверен по схеме XSD... Так как я новичок в этом и попытался выполнить поиск по всему Интернету, я не стал не получите подходящий ответ... Пожалуйста, помогите
3 ответа
Запрос и ответ SOAP проверяются не по вашей схеме, а по схеме SOAP. Вы можете использовать свой XSD для проверки вашего запроса и ответа, если вы импортируете в него SOAP XSD:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://services.test.com/schema/MainData/V1"
xmlns:tns="http://services.test.com/schema/MainData/V1" elementFormDefault="qualified">
<import namespace="http://schemas.xmlsoap.org/soap/envelope/"
schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"></import>
...
Вам не нужно делать это, если ваш экземпляр объявляет schemaLocation
Атрибут, отображающий пространства имен обеих схем (вашей и схемы SOAP) в их местоположения:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://services.test.com/schema/MainData/V1 your-schema.xsd
http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<retrieveDataResponse xmlns="http://services.test.com/schema/MainData/V1">
<Response>The Data retrieved from the Database</Response>
<Id>58</Id>
<Name>fdfdf</Name>
<Age>44</Age>
<Designation>sse</Designation>
</retrieveDataResponse>
</soap:Body>
</soap:Envelope>
У меня была такая же проблема, и для меня импорт схемы не работал. стек:
10:18:03,206 | DEBUG | iEsb | DefaultValidationErrorHandler | | 68 - org.apache.camel.camel-core - 2.6.0.fuse-03-01 | Validation error: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'soapenv:Envelope'.
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'soapenv:Envelope'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:233)[:]
Моя версия Java была: 1.6.0_45. Но я решил это, загрузив xsd и импортировав его в виде файла:
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="envelope.xsd" />
Может быть, это кому-нибудь поможет.
Итак, последнее решение, которое сработало для меня, использует импорт:-
<import namespace="http://schemas.xmlsoap.org/soap/envelope/"
schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"></import>