首页 > 解决方案 > 使用属性访问 PHP SoapClient 响应元素中的值

问题描述

我在处理 PHPSoapClient响应时遇到问题...

我知道我可以使用对象表示法访问响应 XML 元素:

$client = new SoapClient($wsdl,$options);
$data=$client->Method(array('Param'=>"Value"));
$tmp = $data->Results->Asset->Attributes>Attribute;
var_dump($tmp);

问题是当我尝试使用某些属性到达元素时...这是 XML 响应的一部分:

<Results>
 <Asset>
  <Attributes>
   <Attribute Name="ID">0</Attribute>
   <Attribute Name="FirstName">John</Attribute>
   <Attribute Name="Size">Large</Attribute>
  </Attributes>
 </Asset>
 <Asset>
  <Attributes>
   <Attribute Name="ID">1</Attribute>
   <Attribute Name="FirstName">Bob</Attribute>
   <Attribute Name="Size">Medium</Attribute>
  </Attributes>
 </Asset>
 <Asset>
  <Attributes>
   <Attribute Name="ID">2</Attribute>
   <Attribute Name="FirstName">Frank</Attribute>
   <Attribute Name="Size">Small</Attribute>
  </Attributes>
 </Asset>
</Results>

如何使用对象表示法从具有属性“大小”的元素“属性”中获取值?在print_r我得到一个stdClass内部数组(它只是它的一部分)

[0] => stdClass Object
    (
        [Attributes] => stdClass Object
        (
            [Attribute] => Array
            (
                [0] => stdClass Object
                    (
                        [_] => 0
                        [Name] => ID
                    )

                [1] => stdClass Object
                    (
                        [_] => John
                        [Name] => FirstName
                    )

                [2] => stdClass Object
                    (
                        [_] => Large
                        [Name] => Size
                    )
            )
        )
    )
[1] => stdClass Object
    (
        [Attributes] => stdClass Object
        (
            [Attribute] => Array
            (
                [0] => stdClass Object
                    (
                        [_] => 1
                        [Name] => ID
                    )

                [1] => stdClass Object
                    (
                        [_] => Bob
                        [Name] => FirstName
                    )

                [2] => stdClass Object
                    (
                        [_] => Medium
                        [Name] => Size
                    )
            )
        )
    )
[2] => stdClass Object
    (
        [Attributes] => stdClass Object
        (
            [Attribute] => Array
            (
                [0] => stdClass Object
                    (
                        [_] => 2
                        [Name] => ID
                    )

                [1] => stdClass Object
                    (
                        [_] => Frank
                        [Name] => FirstName
                    )

                [2] => stdClass Object
                    (
                        [_] => Small
                        [Name] => Size
                    )
            )
        )
    )

我知道我可能可以使用

$client->__getLastResponse()

并解析,SimpleXMLElement但对我来说似乎不是最佳选择......

标签: phpxmlsoap

解决方案


您应该可以在$data->Results->Asset->Attributes->Attribute[0]->_.

如果您想搜索属性为“size”的值,那么您可能需要一个循环。很难用这么小的样本来判断你的数据是什么样的,但我不相信更简洁的方法array_column()可以适用于这种结构。

<?php
foreach ($data->Results->Asset as $Asset) {
    foreach ($Asset->Attributes->Attribute as $Attribute) {
        if ($Attribute->Name === "Size") {
            echo $Attribute->_;
        }
    }
}

推荐阅读