PHP SoapClient不会将XML响应解释为数组

时间:2012-06-17 00:04:52

标签: php soap soap-client

我正在努力让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(尽管我的眼睛似乎很好)。 nusoapSoapUI使用它都没有问题。

所以我想知道SoapClient的不同之处是什么。

3 个答案:

答案 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));