循环访问 SimpleXML 对象,或将整个对象转换为数组

我正在尝试弄清楚如何迭代返回的SimpleXML对象。

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

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

Tarzan AWS 文档是这样说的:

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

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

 [body] => SimpleXMLElement Object
        (
            [QueryWithAttributesResult] => SimpleXMLElement Object
                (
                    [Item] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [Name] => message12413344443260
                                    [Attribute] => Array
                                        (
                                            [0] => SimpleXMLElement Object
                                                (
                                                    [Name] => active
                                                    [Value] => 1
                                                )

                                            [1] => SimpleXMLElement Object
                                                (
                                                    [Name] => user
                                                    [Value] => john
                                                )

                                            [2] => SimpleXMLElement Object
                                                (
                                                    [Name] => message
                                                    [Value] => This is a message.
                                                )

                                            [3] => SimpleXMLElement Object
                                                (
                                                    [Name] => time
                                                    [Value] => 1241334444
                                                )

                                            [4] => SimpleXMLElement Object
                                                (
                                                    [Name] => id
                                                    [Value] => 12413344443260
                                                )

                                            [5] => SimpleXMLElement Object
                                                (
                                                    [Name] => ip
                                                    [Value] => 10.10.10.1
                                                )

                                        )

                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [Name] => message12413346907303
                                    [Attribute] => Array
                                        (
                                            [0] => SimpleXMLElement Object
                                                (
                                                    [Name] => active
                                                    [Value] => 1
                                                )

                                            [1] => SimpleXMLElement Object
                                                (
                                                    [Name] => user
                                                    [Value] => fred
                                                )

                                            [2] => SimpleXMLElement Object
                                                (
                                                    [Name] => message
                                                    [Value] => This is another message
                                                )

                                            [3] => SimpleXMLElement Object
                                                (
                                                    [Name] => time
                                                    [Value] => 1241334690
                                                )

                                            [4] => SimpleXMLElement Object
                                                (
                                                    [Name] => id
                                                    [Value] => 12413346907303
                                                )

                                            [5] => SimpleXMLElement Object
                                                (
                                                    [Name] => ip
                                                    [Value] => 10.10.10.2
                                                )

                                        )

                                )

                        )

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

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

我是SimpleXML的新手,所以如果我的问题不够具体,我很抱歉。


答案 1

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

//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.

答案 2
get_object_vars($simpleXMLElement);

推荐