PHP SoapClient没有将XML响应解析为数组

4

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

SoapUI 能够查询此Soap方法并返回良好的结果。我也能够使用 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有什么不同之处。
3个回答

1
当返回的数据在您使用的WSDL中没有指定时,就会发生这种情况。任何不在WSDL中的内容都会被汇总到解析XML结束时的“any”元素中。
如果出现这种情况,则应确保您的脚本正在使用正确的SOAP服务的WSDL。
例如,如果您使用的是旧的WSDL,并且服务中现在正在使用新的元素,则它们将最终出现在此“any”元素中!

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”字符串的对象。


0

嗨,Peter,谢谢你的回复!包括那个在内对结果没有影响。 - Chris Rogers
你最终解决了这个问题吗,Chris? - Avindra Goolcharan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接