2009-05-16 10 views
15

Sto cercando di capire come iterare attraverso un oggetto SimpleXML restituito.Ciclo attraverso un oggetto SimpleXML o trasformazione dell'intero elemento in una matrice

Utilizzo un kit di strumenti denominato Tarzan AWS, che si collega a Amazon Web Services (SimpleDB, S3, EC2, ecc.). Sto specificatamente usando SimpleDB.

Posso inserire dati nel servizio Amazon SimpleDB e posso recuperarlo. Non so come gestire l'oggetto SimpleXML che viene restituito.

La documentazione Tarzan AWS dice questo:

Guardate la risposta per navigare attraverso le intestazioni e il corpo della risposta. Si noti che questo è un oggetto, non un array, e che il corpo è un oggetto SimpleXML.

Ecco un esempio dell'oggetto SimpleXML restituito:

 
[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 
               ) 

             ) 

           ) 

         ) 

Così che il codice ho bisogno di ottenere attraverso ciascuna delle voci oggetto? Mi piacerebbe passare in rassegna ciascuno di essi e gestirlo come una query mySQL restituita. Ad esempio, posso interrogare SimpleDB e quindi eseguire il ciclo su SimpleXML in modo da poter visualizzare i risultati sulla pagina.

In alternativa, come si trasforma tutto lo shebang in un array?

Sono nuovo di SimpleXML, quindi mi scuso se le mie domande non sono abbastanza specifiche.

risposta

16

È possibile utilizzare l'oggetto SimpleXML (o le sue proprietà) in un ciclo foreach. Se si desidera collegare attraverso qualcosa di tutti i 'record' come questo può essere utilizzato per accedere e visualizzare i dati:

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

Nota che $ L'articolo sarà un oggetto SimpleXML, come è $ attributo, quindi hanno bisogno di essere referenziati come oggetti, non come array.

Mentre il codice di esempio di cui sopra è scorrendo le matrici in oggetto SimpleXML ($ SimpleXML-> corpo-> QueryWithAttributesResult-> articolo), è possibile anche scorrere un oggetto SimpleXML (diciamo $ SimpleXML-> corpo-> QueryWithAttributesResult -> Articolo [0]), e questo ti darebbe ciascuna delle proprietà dell'oggetto.

Ogni elemento figlio di un oggetto SimpleXML è un'entità XML. Se l'entità XML (tag) non è univoca, l'elemento è semplicemente una matrice di oggetti SimpleXML che rappresentano ciascuna entità.

Se volete, questo dovrebbe creare un più comune matrice di riga/campi dal vostro oggetto SimpleXML (o ottenere si chiude):

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

Grazie molto per questo. Funziona molto bene. Una domanda semplice però. Usando il primo esempio, come faccio a echo solo uno dei $ Attribute-> Value, piuttosto che l'intero lotto. Ho provato tutti i tipi di cose da echo $ Attribute-> Name ['xx'], loop in loop, ecc. Mi sono un po 'confuso. È possibile? O devo solo se le dichiarazioni ($ Attribute-> Value == "xx")? –

+0

Non so di SimpleXML che fornisce un collegamento a ciò che stai facendo (testare il valore durante il ciclo). –

2

Nel caso di risposte XML che non contengono sezioni CDATA (come Amazon's/Tarzan's), puoi usare il seguente assumendo che tu abbia PHP 5.2 o più recente.

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

Questo sarà un programma di utilità standard disponibile a tutti gli oggetti nella prossima versione principale di Tarzan (CloudFusion 2.5).

5

una piccola aggiunta per la correzione di PHP 5.2.

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

Grazie amico, stavo cercando di collegarmi foreach senza conoscere i nomi degli elementi figlio, e non me lo permetteva. Dopo questa funzione ha funzionato perfettamente – sanchy

0

questo ha funzionato:

// $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; 
} 
Problemi correlati