我正在努力让PHP内置SoapClient
来解释我试图呼叫的网络服务回复的响应。
SoapUI
能够查询这种肥皂方法并返回良好的结果。
我也可以nusoap_client
返回正确的结果(但由于其他原因我无法使用nusoap
,并认为我遇到了SoapClient
)。
使用SoapClient
,我可以看到正在返回看似好的数据,但是不是将结果解析并分解成易于使用的值数组,而是将XML响应字符串填充到一个字段中。对象(标记为“任何”)。
我的代码和结果如下所示:
$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
的不同之处是什么。
答案 0 :(得分:1)
我有一个函数可以抓取结果并将其转换为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”字符串的对象。
答案 1 :(得分:1)
当您使用的WSDL中未指定返回的数据时,会发生这种情况。任何不在WSDL中的东西都会被归入这个&#34;任何&#34;解析XML结束时的元素。
如果发生这种情况,那么您应该确保您的脚本使用正确的WSDL来处理您正在使用的SOAP服务。
例如,如果您正在使用旧的WSDL,并且新的元素现在正在服务中使用,那么它们将最终进入这个&#34;任何&#34;元件!
答案 2 :(得分:0)
您是否尝试使用SOAP_SINGLE_ELEMENT_ARRAYS
feature?
<?php
$client = new SoapClient($url, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));