Cvc-elt.1: Cannot Find The Declaration Of Element 'soap:Envelope'

前端 未结 2 1810
陌清茗
陌清茗 2020-12-11 17:56

Currently I\'m using XSD for SOAP XML, but when I run my SOAP XML and XSD on FREEFORMATTER.COM, I get this error:

Cvc-elt.1: Cannot Find The Declarati

相关标签:
2条回答
  • 2020-12-11 18:24

    First, you must add a targetNamespace="http://tempuri.org/" to the xs:schema element of your XSD in order for your XSD to apply to the namespace used in your XML payload.

    Then you can take either of the following approaches: Change the XML or Change the XSD. Choose according to which files you control.

    Change the XML

    Add

    xsi:schemaLocation="http://tempuri.org/ tempuri.xsd
                        http://schemas.xmlsoap.org/soap/envelope/ 
                        http://schemas.xmlsoap.org/soap/envelope/
    

    to the soap:Envelope:

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                   xsi:schemaLocation="http://tempuri.org/ tempuri.xsd
                                       http://schemas.xmlsoap.org/soap/envelope/ 
                                       http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <Cancel_OrderLine xmlns="http://tempuri.org/">
          <Data>
            <Delivery>
              <Delivery_No>1605000194</Delivery_No>
              <Reason>qwertyu</Reason>
            </Delivery>
            <Delivery>
              <Delivery_No>1605000194</Delivery_No>
              <Reason>qwerty</Reason>
            </Delivery>
          </Data>
        </Cancel_OrderLine>
      </soap:Body>
    </soap:Envelope>
    

    Change the XSD

    Add

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

    to the xs:schema element of your XSD:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               targetNamespace="http://tempuri.org/">
    
      <xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/"   
                 schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
    
      <xs:element name="Cancel_OrderLineReq">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Data">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Delivery" maxOccurs="unbounded" minOccurs="0">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element type="xs:int" name="Delivery_No"/>
                        <xs:element type="xs:string" name="Reason"/>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    Both methods will allow successful validation of your SOAP envelop and its payload.

    0 讨论(0)
  • 2020-12-11 18:39

    Perhaps if you validate the xml against xsd, you need to initialize the builderFactory to be "aware of namespaces" - it is false by default.

    final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    builderFactory.setNamespaceAware(true);
    final DocumentBuilder builder = builderFactory.newDocumentBuilder();
    builder.parse(...);
    
    0 讨论(0)
提交回复
热议问题