我正在努力让PHP的内置SoapClient
来解释我试图调用的Web服务返回的响应。
SoapUI
能够询问这种肥皂方法并返回良好的结果。我也能够让nusoap_client
返回正确的结果(但由于其他原因无法使用nusoap
,并认为我坚持SoapClient
)。
使用 SoapClient
,我可以看到返回看似良好的数据,但不是将结果解析并分解为易于使用的值数组,而是将 XML 响应字符串填充到对象的单个字段中(标记为"any")。
我的代码和结果如下所示:
$client = new SoapClient($url);
$results = $client->GetPropertiesByProjectAndContractStatus($params);
var_dump($results);
上述代码的输出如下:
object(stdClass)[3]
public 'GetListingsByGUIDResult' =>
object(stdClass)[4]
public 'any' => string '<xs:schema xmlns="" ........ (long xml here) ....
现在,也许我正在使用的服务可能返回了一些有问题的 xml(尽管在我看来似乎很好)。 nusoap
和SoapUI
使用它也没有问题。
所以我想知道SoapClient
有什么不同。
我有一个函数可以抓取该结果并将其转换为 dom 对象,以便您可以使用 dom 函数提取数据。
protected function getElementsFromResult($elementName, $simpleresult) {
$dom = new DOMDocument ();
$dom->preserveWhiteSpace = FALSE;
if ($simpleresult == null) {
echo 'null';
return null;
} else {
$dom->loadXML ( $simpleresult->any );
return $dom->getElementsByTagName ( $elementName );
}
$elementName
是您希望从结果中获取的元素的名称,$simpleresult
是包含"any"字符串的对象。
当您正在使用的 WSDL 中未指定返回的数据时,会发生这种情况。不在 WSDL 中的任何内容都将在解析 XML 结束时被归入这个"any"元素。
如果发生这种情况,则应确保脚本为您正在使用的 SOAP 服务使用正确的 WSDL。
例如,如果您使用的是旧的 WSDL,并且现在在服务中使用了新元素,则它们最终将位于此"any"元素中!
您是否尝试使用SOAP_SINGLE_ELEMENT_ARRAYS
功能?
<?php
$client = new SoapClient($url, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));