19

我正在尝试解决如何通过返回的 SimpleXML 对象进行迭代。

我正在使用一个名为Tarzan AWS的工具包,它连接到 Amazon Web Services(SimpleDB、S3、EC2 等)。我专门使用 SimpleDB。

我可以将数据放入 Amazon SimpleDB 服务,然后我可以取回它。我只是不知道如何处理返回的 SimpleXML 对象。

Tarzan AWS 文档是这样说的:

查看响应以浏览响应的标头和正文。请注意,这是一个对象,而不是数组,并且主体是一个 SimpleXML 对象。

以下是返回的 SimpleXML 对象的示例:

[body] => SimpleXMLElement 对象
        (
            [QueryWithAttributesResult] => SimpleXMLElement 对象
                (
                    [项目] => 数组
                        (
                            [0] => SimpleXMLElement 对象
                                (
                                    [名称] => 消息12413344443260
                                    [属性] => 数组
                                        (
                                            [0] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 活跃
                                                    [值] => 1
                                                )

                                            [1] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 用户
                                                    [价值] => 约翰
                                                )

                                            [2] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 消息
                                                    [值] => 这是一条消息。
                                                )

                                            [3] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 时间
                                                    [价值] => 1241334444
                                                )

                                            [4] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 身份证
                                                    [价值] => 12413344443260
                                                )

                                            [5] => SimpleXMLElement 对象
                                                (
                                                    [名称] => ip
                                                    [值] => 10.10.10.1
                                                )

                                        )

                                )

                            [1] => SimpleXMLElement 对象
                                (
                                    [名称] => 消息12413346907303
                                    [属性] => 数组
                                        (
                                            [0] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 活跃
                                                    [值] => 1
                                                )

                                            [1] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 用户
                                                    [价值] => 弗雷德
                                                )

                                            [2] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 消息
                                                    [值] => 这是另一条消息
                                                )

                                            [3] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 时间
                                                    [价值] => 1241334690
                                                )

                                            [4] => SimpleXMLElement 对象
                                                (
                                                    [名称] => 身份证
                                                    [价值] => 12413346907303
                                                )

                                            [5] => SimpleXMLElement 对象
                                                (
                                                    [名称] => ip
                                                    [值] => 10.10.10.2
                                                )

                                        )

                                )

                        )

那么我需要什么代码来遍历每个对象项?我想遍历它们中的每一个并像返回的 mySQL 查询一样处理它。例如,我可以查询 SimpleDB,然后通过 SimpleXML 循环,这样我就可以在页面上显示结果。

或者,你如何将整个 shebang 变成一个数组?

我是 SimpleXML 的新手,所以如果我的问题不够具体,我深表歉意。

4

6 回答 6

21

您可以在循环中使用SimpleXML对象(或其属性) 。foreach如果您想遍历所有“记录”,可以使用类似这样的方法来访问和显示数据:

//Loop through all the members of the Item array 
//(essentially your two database rows).
foreach($SimpleXML->body->QueryWithAttributesResult->Item as $Item){
    //Now you can access the 'row' data using $Item in this case 
    //two elements, a name and an array of key/value pairs
    echo $Item->Name;
    //Loop through the attribute array to access the 'fields'.
    foreach($Item->Attribute as $Attribute){
        //Each attribute has two elements, name and value.
        echo $Attribute->Name . ": " . $Attribute->Value;
    }
}

请注意,$Item 将是一个 SimpleXML 对象,$Attribute 也是如此,因此它们需要作为对象而不是数组来引用。

虽然上面的示例代码循环遍历 SimpleXML 对象($SimpleXML->body->QueryWithAttributesResult->Item)中的数组,但您也可以循环遍历 SimpleXML 对象(例如 $SimpleXML->body->QueryWithAttributesResult->Item[ 0]),这将为您提供每个对象的属性。

SimpleXML 对象的每个子元素都是一个 XML 实体。如果 XML 实体(标签)不是唯一的,那么该元素只是表示每个实体的 SimpleXML 对象数组。

如果您愿意,这应该从您的 SimpleXML 对象创建一个更常见的行/字段数组(或让您关闭):

foreach($SimpleXML->body->QueryWithAttributesResult->Item as $Item){
    foreach($Item->Attribute as $Attribute){
        $rows[$Item->Name][$Attribute->Name] = $Attribute->Value;
    }
}

//Now you have an array that looks like:
$rows['message12413344443260']['active'] = 1;
$rows['message12413344443260']['user'] = 'john';
//etc.
于 2009-05-16T01:34:28.000 回答
12
get_object_vars($simpleXMLElement);
于 2012-02-10T12:28:58.623 回答
10

PHP 5.2 修复的一个小补充。

$response_array = json_decode(json_encode($response),true);
于 2010-04-05T14:25:10.503 回答
2

对于不包含 CDATA 部分的 XML 响应(如 Amazon's/Tarzan's),假设您有 PHP 5.2 或更高版本,您可以使用以下内容。

// Get a SimpleXML response back from Tarzan
$s3 = new AmazonS3();
$response = $s3->list_buckets();

// Convert SimpleXML to Array in PHP 5.2.
$response_array = json_decode(json_encode($response));

这将是下一个主要版本 Tarzan (CloudFusion 2.5) 中所有对象都可以使用的标准实用程序。

于 2009-08-19T01:47:12.690 回答
0

我发现的几乎所有示例都指的是您已经知道节点的特定示例。以下函数将在不知道节点名称或它们是否有子节点的情况下将 SimpleXMLElement 转换为数组。也可以与 CDATA 部分一起正常工作。

function parseXML(SimpleXMLElement $xml) : array
{
    $array = [];

    foreach(iterator_to_array($xml, TRUE) as $key => $value)
        $array[$key] = ($value->count() > 1) ? parseXML($value) : (string)$value;

    return $array;
}
于 2019-02-26T11:50:57.587 回答
-2

这有效:

// $result is a Simple XML object

$result = convertSimpleXMLToArray($result);

function convertSimpleXMLToArray($xml)
{
    if(class_basename($xml) == 'SimpleXMLElement')
    {
        $xml = get_object_vars($xml);
        foreach($xml as $key => $value)
        {
            if(class_basename($value) == 'SimpleXMLElement') $xml[$key] = convertSimpleXMLToArray($value);
        }
    }

    return $xml;
}
于 2017-08-28T19:59:38.767 回答