【问题标题】:Error cvc-elt.1.a: Cannot find the declaration of element 'soapenv:Body'错误 cvc-elt.1.a:找不到元素“soapenv:Body”的声明
【发布时间】:2014-12-17 13:52:20
【问题描述】:

我已经尝试了一些提示,但我没有解决这个问题。我用 xmlspy-client 验证了 wsdl,它说它和 xsd 是有效的。

当我使用 SOAPUI 发送这样的请求时,我得到了提到的异常 (cvc-elt.1.a: 找不到元素 'soapenv:Body' 的声明)。

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://schemas.domain.com/wsdl/fuelprice/v1" xmlns:mod="http://schemas.domain.com/wsdl/fuelprice/v1/model">
       <soapenv:Header/>
       <soapenv:Body>
        <v1:AuthenticationHeader client="client">
             <v1:token>token</v1:token>
          </v1:AuthenticationHeader>
          <v1:GetAreaFuelStationsRequest provider="p1" prices="true">
             <v1:area>
                <mod:center ellipsoid="false">
                   <mod:latitude>22.519172</mod:latitude>
                   <mod:longitude>13.406093</mod:longitude>
                </mod:center>
                <mod:radius>10</mod:radius>
             </v1:area>
          </v1:GetAreaFuelStationsRequest>
       </soapenv:Body>
    </soapenv:Envelope>

我尝试在 wsdl 中导入soap 模式。之后我收到一条错误消息:

“cvc-complex-type.2.4.a:发现以元素“v1:latitude”开头的无效内容。应为“{”http://schemas.domain.com/wsdl/fuelprice/v1/model“:latitude}”之一。”。

老实说,我使用的是 rest 和 json,但在这种架构配置方面遇到了一些困难。

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="wsdl-viewer.xsl"?>
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://schemas.domain.com/wsdl/fuelprice/v1" xmlns:model="http://schemas.domain.com/wsdl/fuelprice/v1/model" xmlns:exception="http://schemas.domain.com/wsdl/fuelprice/v1/exception" targetNamespace="http://schemas.domain.com/wsdl/fuelprice/v1">
        <wsdl:types>
            <xsi:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.domain.com/wsdl/fuelprice/v1" elementFormDefault="qualified">
                <xsi:import namespace="http://schemas.domain.com/wsdl/fuelprice/v1/model" schemaLocation="common.xsd"/>
                <xsi:import namespace="http://schemas.domain.com/wsdl/fuelprice/v1/exception" schemaLocation="exception.xsd"/>
                <xsi:element name="GetAreaFuelStationsRequest">
                    <xsi:complexType>
                        <xsi:sequence>
                            <xsi:element name="area" type="model:Area"/>
                        </xsi:sequence>
                        <xsi:attribute name="provider" type="xsi:string" use="optional"/>
                        <xsi:attribute name="prices" type="xsi:boolean" use="required"/>
                    </xsi:complexType>
                </xsi:element>
                <xsi:element name="GetAreaFuelStationsResponse">
                    <xsi:complexType>
                        <xsi:sequence>
                            <xsi:element name="entry" type="model:SearchResult" minOccurs="0" maxOccurs="unbounded"/>
                        </xsi:sequence>
                        <xsi:attribute name="countTotal" type="xsi:int" use="optional"/>
                    </xsi:complexType>
                </xsi:element>
            </xsi:schema>
        </wsdl:types>
        <wsdl:message name="SearchAreaFuelStationsRequest">
            <wsdl:part name="auth" element="tns:AuthenticationHeader"/>
            <wsdl:part name="body" element="tns:GetAreaFuelStationsRequest"/>
        </wsdl:message> 
        <wsdl:message name="SearchAreaFuelStationsResponse">
            <wsdl:part name="body" element="tns:GetAreaFuelStationsResponse"/>
        </wsdl:message>
        <wsdl:portType name="FuelDataService">
            <wsdl:operation name="GetAreaFuelStations">
                <wsdl:input message="tns:GetAreaFuelStationsRequest"/>
                <wsdl:output message="tns:GetAreaFuelStationsResponse"/>
                <wsdl:fault name="ServiceError" message="tns:ServiceErrorFault"/>
                <wsdl:fault name="AuthenticationError" message="tns:AuthenticationErrorFault"/>
            </wsdl:operation>
        </wsdl:portType>
        <wsdl:binding name="FuelDataService" type="tns:FuelDataService">
            <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="GetAreaFuelStations">
                <soap:operation soapAction="urn:GetAreaFuelStations"/>
                <wsdl:input>
                    <soap:body use="literal"/>
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="literal"/>
                </wsdl:output>
                <wsdl:fault name="ServiceError"/>
                <wsdl:fault name="AuthenticationError"/>
            </wsdl:operation>
        </wsdl:binding>
        <wsdl:service name="FuelDataService">
            <wsdl:port name="FuelDataService" binding="tns:FuelDataService">
                <soap:address location="No target address"/>
            </wsdl:port>
        </wsdl:service>
    </wsdl:definitions>

XSD:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsi:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema" xmlns:model="http://schemas.domain.com/wsdl/fuelprice/v1/model" targetNamespace="http://schemas.domain.com/wsdl/fuelprice/v1/model" elementFormDefault="qualified">
        <xsi:complexType name="FuelStation">
            <xsi:sequence>
                <xsi:element name="location" type="model:GeoLocation"/>
                <xsi:element name="name" type="xsi:string"/>
            </xsi:sequence>
            <xsi:attribute name="id" type="xsi:long" use="optional"/>
        </xsi:complexType>
        <xsi:complexType name="GeoLocation">
            <xsi:sequence>
                <xsi:element name="latitude" type="xsi:double"/>
                <xsi:element name="longitude" type="xsi:double"/>
            </xsi:sequence>
            <xsi:attribute name="ellipsoid" type="xsi:string" use="required"/>
        </xsi:complexType>
        <xsi:complexType name="Area">
            <xsi:sequence>
                <xsi:element name="center" type="model:GeoLocation"/>
                <xsi:element name="radius" type="xsi:float"/>
            </xsi:sequence>
        </xsi:complexType>
    </xsi:schema>

对我来说,我应该改变什么来让它工作并不明显。有人知道命名空间设置有什么问题吗?我将不胜感激。

【问题讨论】:

标签: validation soap namespaces wsdl request


【解决方案1】:

这个问题通过问题validating SOAP-Request with a SOAPHandler解决了

提取消息正文,在架构中添加所需的命名空间并将正文作为文档进行验证就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多