Конверт »: отсутствует соответствующая глобальная декларация для корневой ошибки валидации при проверке ответа SOAP в php - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь проверить конверт с мыльным ответом, но получаю ошибки

У меня есть этот мыльный ответ, который я не могу изменить (response.xml)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <GetVehicleMakesResponse xmlns="http://api.examle.com/">
        <GetVehicleMakesResult>
            <VehicleMakes xmlns="">
                <VehicleMake>
                    <MakeID>37</MakeID>
                    <MakeName>ALFA ROMEO</MakeName>
                </VehicleMake>
                <VehicleMake>
                    <MakeID>3</MakeID>
                    <MakeName>AUDI</MakeName>
                </VehicleMake>
                <VehicleMake>
                    <MakeID>19</MakeID>
                    <MakeName>BMW</MakeName>
                </VehicleMake>
            </VehicleMakes>
        </GetVehicleMakesResult>
    </GetVehicleMakesResponse>
</soap:Body>

и у меня есть XSD-файл для проверки этого по (GetVehicleMakes.xsd)

<xs:schema xmlns:tns="http://api.examle.com/" attributeFormDefault="unqualified" elementFormDefault="qualified" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
  <xs:element name="GetVehicleMakesResponse">
        <xs:complexType>
              <xs:sequence>
                    <xs:element name="GetVehicleMakesResult">
                          <xs:complexType>
                                <xs:sequence>
                                      <xs:element name="VehicleMakes">
                                            <xs:complexType>
                                                  <xs:sequence>
                                                        <xs:element maxOccurs="unbounded" name="VehicleMake">
                                                              <xs:complexType>
                                                                    <xs:sequence>
                                                                          <xs:element name="MakeID" type="xs:unsignedByte" />
                                                                          <xs:element name="MakeName" type="xs:string" />
                                                                    </xs:sequence>
                                                              </xs:complexType>
                                                        </xs:element>
                                                  </xs:sequence>
                                            </xs:complexType>
                                      </xs:element>
                                </xs:sequence>
                          </xs:complexType>
                    </xs:element>
              </xs:sequence>
        </xs:complexType>
  </xs:element>

когда я проверяю ответ на XSD с использованием PHP DOM Document

$xml = new DOMDocument(); 
$xml->load('response.xml');
$xml->schemaValidate('GetVehicleMakes.xsd')

Я получаю следующую ошибку

Error 1845: Element '{http://www.w3.org/2003/05/soap-envelope}Envelope': No matching global declaration available for the validation root. in file:/P:/xampp/htdocs/test/response.xml on line 1

Может кто-нибудь пролить свет на то, как я могу решить эту ошибку, пожалуйста?

1 Ответ

1 голос
/ 17 июня 2019

Это проблема с объявлением. В ответе xml пространство имен для элемента мыльного конверта отличается от пространства имен, определенного в файле xsd.

В файле xsd определено следующее:

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

Но элемент мыльного конверта в ответе определяется пространством имен http://www.w3.org/2003/05/soap-envelope. Как говорится в вашем сообщении об ошибке, проверка по xsd не знает этого конкретного пространства имен для элемента envelope.

Поскольку вы не можете изменить ответ мыла, вы должны отредактировать файл xsd. Просто импортируйте правильное определение конверта.

<xs:import namespace="http://www.w3.org/2003/05/soap-envelope" schemaLocation="http://www.w3.org/2003/05/soap-envelope"/>

Вы можете признать, что проверка длится несколько секунд. Это вполне нормально из-за избыточного трафика в определениях, выпущенных w3c. W3C установил задержки на запросах определения. Чтобы избежать этих задержек, вы можете сохранить определения в локальном файле и использовать их вместо этого.

...