SimpleXMLオブジェクトをループするか、全体を配列に変換する 質問する

SimpleXMLオブジェクトをループするか、全体を配列に変換する 質問する

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

私は、ターザン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オブジェクト
                                                    [名前] => ID
                                                    [値] => 12413344443260

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



                            [1] => SimpleXMLElementオブジェクト
                                    [名前] => メッセージ12413346907303
                                    [属性] => 配列
                                            [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 を初めて使用するので、質問が具体的でない場合はお詫び申し上げます。

ベストアンサー1

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.

おすすめ記事