信封':在 php 中验证 SOAP 响应时,没有匹配的全局声明可用于验证根错误
Envelope': No matching global declaration available for the validation root error when validating SOAP response in php
我正在尝试验证 soap 响应信封,但不断收到错误
我有这个我无法改变的肥皂反应 (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>
当我使用 PHP DOM 文档
验证针对 XSD 的响应时
$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
任何人都可以对我如何解决这个错误发表一些见解吗?
这是申报问题。在 xml 响应中,soap 信封元素的名称空间与 xsd 文件中定义的名称空间不同。
在 xsd 文件中定义如下:
<xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
但是响应中的 soap 信封元素是使用命名空间 http://www.w3.org/2003/05/soap-envelope
定义的。正如您的错误消息所说,针对 xsd 的验证不知道信封元素的这个特定命名空间。
由于您无法更改 soap 响应,因此您必须编辑 xsd 文件。只需导入正确的信封定义。
<xs:import namespace="http://www.w3.org/2003/05/soap-envelope" schemaLocation="http://www.w3.org/2003/05/soap-envelope"/>
您可能认识到,验证持续几秒钟。这是很正常的,因为 excessive traffic 在 w3c 发布的定义上。 w3c 对定义请求设置了延迟。为避免这些延迟,您可以将定义保存到本地文件并改用它们。
我正在尝试验证 soap 响应信封,但不断收到错误
我有这个我无法改变的肥皂反应 (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>
当我使用 PHP DOM 文档
验证针对 XSD 的响应时$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
任何人都可以对我如何解决这个错误发表一些见解吗?
这是申报问题。在 xml 响应中,soap 信封元素的名称空间与 xsd 文件中定义的名称空间不同。
在 xsd 文件中定义如下:
<xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
但是响应中的 soap 信封元素是使用命名空间 http://www.w3.org/2003/05/soap-envelope
定义的。正如您的错误消息所说,针对 xsd 的验证不知道信封元素的这个特定命名空间。
由于您无法更改 soap 响应,因此您必须编辑 xsd 文件。只需导入正确的信封定义。
<xs:import namespace="http://www.w3.org/2003/05/soap-envelope" schemaLocation="http://www.w3.org/2003/05/soap-envelope"/>
您可能认识到,验证持续几秒钟。这是很正常的,因为 excessive traffic 在 w3c 发布的定义上。 w3c 对定义请求设置了延迟。为避免这些延迟,您可以将定义保存到本地文件并改用它们。