web-dev-qa-db-fra.com

Comment résoudre soapenv: Problème d’enveloppe dans le schéma XSD lors de la validation avec SOAP demande de réponse

J'ai une demande 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>

et une réponse 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>

Maintenant, mon schéma XSD est: -

<?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>

Maintenant, le problème est que chaque fois que j'essaie de valider ma demande SOAP par rapport à ce schéma XSD, l'erreur suivante apparaît: -

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'.

Aidez-moi s'il vous plaît ... J'ai besoin de savoir ce que je dois modifier dans mon schéma XSD pour que la demande/réponse SOAP soit validée par rapport au schéma XSD ... Depuis que je suis nouveau et que j'ai essayé de chercher partout Internet, je n'ai pas eu de réponse convenable ... S'il vous plaît, aidez-moi

8

La demande et la réponse SOAP ne sont pas validées par votre schéma, mais par le schéma SOAP schema . Vous pouvez utiliser votre XSD pour valider votre demande et votre réponse si vous importez le SOAP XSD dans celle-ci:

<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>

...

Vous n'avez pas à le faire si votre instance déclare un attribut schemaLocation mappant les espaces de noms des deux schémas (le vôtre et le schéma SOAP) à leurs emplacements:

<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
helderdarocha

J'ai eu le même problème et pour moi l'importation de schéma ne fonctionnait pas. Stack:

    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)[:]

Ma version de Java était la suivante: 1.6.0_45. Mais je l’ai résolue en téléchargeant xsd et en l’important sous forme de fichier:

<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="envelope.xsd" />

Cela aidera peut-être quelqu'un. 

2
Marcin Erbel

Donc, la solution finale qui a fonctionné pour moi utilise l’import: -

<import namespace="http://schemas.xmlsoap.org/soap/envelope/"   
            schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"></import>
0