4

我正在努力让 PHP 内置SoapClient来解释从我试图调用的 Web 服务返回的响应。

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不同。

4

3 回答 3

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是包含“任何”字符串的对象。

于 2012-08-05T10:47:30.993 回答
1

当您使用的 WSDL 中未指定返回的数据时,就会发生这种情况。在解析 XML 结束时,任何不在 WSDL 中的内容都将集中到这个“任何”元素中。

如果发生这种情况,那么您应该确保您的脚本对您正在使用的 SOAP 服务使用正确的 WSDL。

例如,如果您正在使用旧的 WSDL,而新元素现在正在服务中使用,那么它们最终会出现在这个“任何”元素中!

于 2015-01-18T23:18:33.823 回答
0

您是否尝试使用该SOAP_SINGLE_ELEMENT_ARRAYS功能

<?php
$client = new SoapClient($url, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));
于 2012-06-26T13:45:21.853 回答