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


PHP SoapClient is not interpreting XML response into array

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

所以我想知道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));