19

返された SimpleXML オブジェクトを反復処理する方法を見つけようとしています。

アマゾン ウェブ サービス (SimpleDB、S3、EC2 など) に接続するTarzan AWSというツールキットを使用しています。特にSimpleDBを使用しています。

データを Amazon SimpleDB サービスに入れることができ、それを取り戻すことができます。返された SimpleXML オブジェクトを処理する方法がわかりません。

Tarzan AWS のドキュメントには、次のように書かれています。

応答を見て、応答のヘッダーと本文をナビゲートします。これは配列ではなくオブジェクトであり、本体は SimpleXML オブジェクトであることに注意してください。

返された SimpleXML オブジェクトのサンプルを次に示します。

[本体] => SimpleXMLElement オブジェクト
        (
            [QueryWithAttributesResult] => SimpleXMLElement オブジェクト
                (
                    [項目] => 配列
                        (
                            [0] => SimpleXMLElement オブジェクト
                                (
                                    [名前] => message12413344443260
                                    [属性] => 配列
                                        (
                                            [0] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => アクティブ
                                                    [値] => 1
                                                )

                                            [1] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => ユーザー
                                                    [値] => ジョン
                                                )

                                            [2] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => メッセージ
                                                    [値] => メッセージです。
                                                )

                                            [3] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => 時間
                                                    [値] => 1241334444
                                                )

                                            [4] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => ID
                                                    [値] => 12413344443260
                                                )

                                            [5] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => ip
                                                    [値] => 10.10.10.1
                                                )

                                        )

                                )

                            [1] => SimpleXMLElement オブジェクト
                                (
                                    [名前] => message12413346907303
                                    [属性] => 配列
                                        (
                                            [0] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => アクティブ
                                                    [値] => 1
                                                )

                                            [1] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => ユーザー
                                                    [値] => フレッド
                                                )

                                            [2] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => メッセージ
                                                    [値] => これは別のメッセージです
                                                )

                                            [3] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => 時間
                                                    [値] => 1241334690
                                                )

                                            [4] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => ID
                                                    [値] => 12413346907303
                                                )

                                            [5] => SimpleXMLElement オブジェクト
                                                (
                                                    [名前] => ip
                                                    [値] => 10.10.10.2
                                                )

                                        )

                                )

                        )

では、各オブジェクト項目を通過するにはどのようなコードが必要なのでしょうか? それぞれをループして、返された mySQL クエリのように処理したいと思います。たとえば、SimpleDB にクエリを実行し、SimpleXML をループして結果をページに表示できます。

または、シバン全体を配列に変換するにはどうすればよいですか?

私は 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 は $Attribute と同様に SimpleXML オブジェクトになるため、配列ではなくオブジェクトとして参照する必要があることに注意してください。

上記のコード例では、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 修正のための 1 つのわずかな追加。

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

CDATA セクションを含まない XML 応答 (Amazon や Tarzan など) の場合、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 に答える