【问题标题】:PHP SoapClient is not interpreting XML response into arrayPHP SoapClient 没有将 XML 响应解释为数组
【发布时间】:2012-06-17 00:04:51
【问题描述】:

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

SoapUI 能够询问这个soap 方法并返回良好的结果。 我也能够让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 有什么不同。

【问题讨论】:

    标签: php soap soap-client


    【解决方案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 是包含“任意”字符串的对象。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您是否尝试过使用SOAP_SINGLE_ELEMENT_ARRAYS feature

        <?php
        $client = new SoapClient($url, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));
        

        【讨论】:

        • 嗨彼得,感谢您的回复!包括这对结果没有影响。
        • 你有没有想过这个克里斯?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多