2009-05-16 9 views
15

返されたSimpleXMLオブジェクトを反復処理する方法を試しています。SimpleXMLオブジェクトをループするか、全体を配列に変換する

私はAmazon Web Services(SimpleDB、S3、EC2など)に接続するTarzan AWSというツールキットを使用しています。私は特にSimpleDBを使っています。

Amazon SimpleDBサービスにデータを入れることができます。私はそれを元に戻すことができます。返されるSimpleXMLオブジェクトをどのように処理するのか分かりません。レスポンスのヘッダとボディをナビゲートする応答で

ルック:

ターザン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をループすることで、結果をページに表示することができます。

また、シバン全体をどのように配列に変換しますか?

私はSimpleXMLを使い慣れていないので、私の質問が十分ではない場合はお詫び申し上げます。

答えて

16

foreachループでSimpleXMLオブジェクト(またはそのプロパティ)を使用できます。 $属性があるとして、

//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; 
    } 
} 

注$項目は、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. 
+0

感謝を。それはとてもうまくいっています。 しかし、簡単な質問です。最初の例を使用して、全体のロットではなく、$ Attribute-> Valueのどれかをエコーし​​ます。私はecho $ Attribute-> Name ['xx']、ループ内のループなどからあらゆる種類のものを試しました。私はやや混乱しました。それも可能ですか?または、if($ Attribute-> Value == "xx")文をifにするだけですか? –

+0

私はあなたがやっていることへのショートカットを提供するSimpleXMLについて知らない(ループ中に値をテストする)。 –

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)のすべてのオブジェクトで使用できる標準ユーティリティです。

5

PHP 5.2修正用に少し追加されました。

$response_array = json_decode(json_encode($response),true); 
6
get_object_vars($simpleXMLElement); 
+0

ありがとう、私は子要素の名前を知らずにforeachでループしようとしていました。この機能の後、それは完全に働いた – sanchy

0

これは働いていた。そのために非常に多くの

// $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; 
} 
関連する問題