【问题标题】:Getting value from SOAP response in php从 php 中的 SOAP 响应中获取价值
【发布时间】:2013-05-22 17:02:18
【问题描述】:

我正在使用 SOAP ui 完美地获得一个 SOAP 调用的 SOAP 响应,但是当我在 php 中调用它时,我无法遍历所需的元素(在这种情况下为 CreditId),我想要的。

以下是我使用 SOAP ui 得到的 SOAP 响应:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
   <soap-env:Header/>
   <soap-env:Body>
      <n0:getProjectCreditListResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style">
         <EUserGuid>33/XIcx+3/GxWABQVoJXWA==</EUserGuid>
         <EtCurrCreditList>
            <item>
               <PhaseId/>
               <CreditcategoryDescrption>Project Information Forms</CreditcategoryDescrption>
               <CreditId>CSD1GSP1L-1000008140</CreditId>
            </item>
            <item>
               <PhaseId/>
               <CreditcategoryDescrption>Project Information Forms</CreditcategoryDescrption>
               <CreditId>CSD1GSP2L-1000008140</CreditId>
            </item>
</EtCurrCreditList>
         <EtErrorLogInfo/>
      </n0:getProjectCreditListResponse>
   </soap-env:Body>
</soap-env:Envelope>

现在我已经浏览了网站上的各种类似问题,建议这样做以获得所需的元素:

$client = new SoapClient('wsdl file path',array('trace'=>1,'exceptions'=>1);
$res = $client->getCreditFormDataXml(array(input arguments));

    $xml = simplexml_load_string($res);
    $xml->registerXPathNamespace('soap-env', 'http://schemas.xmlsoap.org/soap/envelope/');
    $xml->registerXPathNamespace('n0', 'urn:sap-com:document:sap:soap:functions:mc-style');
    foreach ($xml->xpath('//EtCurrCreditList//item//CreditId') as $item)
    {
        var_dump($item);
    }

但是我得到一个错误说明

警告:simplexml_load_string() 期望参数 1 是字符串

我尝试将 $res 变量转换为字符串,但它给出的错误是

stdClass 类的对象无法转换为字符串

但如果我执行 var_dump($res),我会得到如下输出:

object(stdClass)[2]
  public 'EUserGuid' => string 'ß×!Ì~ßñ±X�PV‚WX' (length=16)
  public 'EtCurrCreditList' => 
    object(stdClass)[3]
  public 'EtErrorLogInfo' => 
    object(stdClass)[4]

为什么代码没有进入 EtCurrCreditList 的子节点,以便我可以处理它以获得所需的值。 - 已解决

最终输出:

stdClass Object
(
    [EUserGuid] => ß×!Ì~ßñ±XPV‚WX
    [EtCurrCreditList] => stdClass Object
        (
            [item] => Array
                (
                    [0] => stdClass Object
                        (
                            [PhaseId] => 
                            [PhaseDescription] => 
                            [CreditcategoryId] => CSD1GSL-1000008140
                            [CreditcategoryDescrption] => Project Information Forms
                            [CreditId] => CSD1GSP1L-1000008140
                         )
            [1] => stdClass Object
                        (
                            [PhaseId] => 
                            [PhaseDescription] => 
                            [CreditcategoryId] => CSD1GSL-1000008140
                            [CreditcategoryDescrption] => Project Information Forms
                            [CreditId] => CSD1GSP2L-1000008140
            )
            [2] => stdClass Object
                        (
                            [PhaseId] => 
                            [PhaseDescription] => 
                            [CreditcategoryId] => CSD1GSL-1000008140
                            [CreditcategoryDescrption] => Project Information Forms
                            [CreditId] => CSD1GSP3L-1000008140
            )
        )

        )

    [EtErrorLogInfo] => stdClass Object
        (
        )

【问题讨论】:

  • 试试这个。这可能会解决您的疑问stackoverflow.com/questions/5048685/…
  • 您好,感谢您的回复,我只按照这些步骤操作,但问题是 simplexml_load_string 函数无法将 $res 识别为字符串,,那么我该如何先解决这个问题。我还尝试复制 xml 并将其用作输入,然后执行上述代码,它提供了所有 creditID,但不是通过使用 $res 作为输入

标签: php soap wsdl soapui soap-client


【解决方案1】:

使用echo"&lt;pre&gt;";print_r($res);,您将能够更好地理解如何遍历或向我们展示结果。

$res=stdClass Object ( [EUserGuid] => ß×!Ì~ßñ±XPV‚WX [EtCurrCreditList] => stdClass Object ( ) [EtErrorLogInfo] => stdClass Object ( ) )

现在使用

foreach($res->EUserGuid as $data)
       {
         //Your logic 
       }

EtCurrCreditListEtErrorLogInfo 相同,如果这些对象包含任何内容,则还有嵌套循环。

根据您的新输出进行更新。 你可以像这样迭代它

$res->EUserGuid=$something;

foreach($res->EtCurrCreditList->item as $eachItem)
{
    $eachItem->PhaseId=$your_ wish;
    $eachItem->PhaseDescription==$your_ wish;
    $eachItem->CreditcategoryId==$your_ wish;
    $eachItem->CreditcategoryDescrption==$your_ wish;
    $eachItem->CreditId=$your_ wish;
}

并且可以忽略EtErrorLogInfo

【讨论】:

  • 您好,感谢@rahulRaj 的评论。我这样做了,我得到的输出是:stdClass Object ( [EUserGuid] =&gt; ß×!Ì~ßñ±XPV‚WX [EtCurrCreditList] =&gt; stdClass Object ( ) [EtErrorLogInfo] =&gt; stdClass Object ( ) ) 所以它似乎没有遍历 EtCurrCreditList 的节点,你能提出任何具体的原因吗?
  • 您好,再次感谢您的回复,我尝试使用代码获取 CreditID 并运行:foreach($res-&gt;EtCurrCreditList as $val1 ) { foreach($val1-&gt;item as $val2) { foreach($val2-&gt;CreditId as $val) { print_r($val); } } } 现在我没有得到任何输出,只是空白屏幕,没有错误或任何显示。有关如何获得 creditId 的任何帮助..??
  • 从响应中你可以看到只有 EUserGuid 的值,其余的都是空的,
  • 是的,你是对的,我没有得到 EtCurrCreditList 的任何值,但是当我使用 wsdl 检查soapUI 中的响应时,我也可以看到 EtCurrCreditList 中的值。为什么 SoapClient 没有给出这些值?有什么线索吗?
  • 你能给出你在数组中提供的 wsdl url 和一组输入值吗(输入参数)
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多