2010-04-28 20 views
12

La variabile $ d deriva dalla funzione file_get_contents in un URL.SimpleXMLElement to PHP Array

$answer = @new SimpleXMLElement($d); 

Di seguito è uscita del print_r ($ risposta):

SimpleXMLElement Object 
(
    [Amount] => 2698 
    [Status] => OK 
    [State] => FL 
    [Country] => USA 
) 

Come posso recuperare il valore di ogni elemento e aggiungere ad un array? non riesco a capirlo.

risposta

9

La risposta $ può già funzionare come una matrice. È possibile farlo se si vuole mettere in un vero array,

$array = array(); 
    foreach($answer as $k => $v) { 
    $array[$k] = $v; 
    } 
+0

non riesco a scorrere un oggetto SimpleXMLElement nel seguente modo –

37

In questo semplice tipo caso di fusione funziona anche:

$my_array = (array)$answer 
+0

Questo è stato veloce e semplice. Ha funzionato come un fascino! Grazie! – cbloss793

0

questa funzione analizzare una ricorsiva xml SimpleXML di serie ricorsiva

function SimpleXML2Array($xml){ 
    $array = (array)$xml; 

    //recursive Parser 
    foreach ($array as $key => $value){ 
     if(strpos(get_class($value),"SimpleXML")!==false){ 
      $array[$key] = SimpleXML2Array($value); 
     } 
    } 

    return $array; 
} 
+0

Ho un problema con questa funzione, perché il typecasting di ogni bambino xml in un array può darti un problema quando il testo è tra i tag CDATA. –

2

Ho un problema con questa funzione perché il typecasting di ogni bambino xml in un array può causare un problema quando il testo si trova tra i tag CDATA.

Ho risolto questo problema controllando se il risultato del typecasting su un array è vuoto. Se è così, dattilografalo su una stringa e otterrai un risultato corretto.

ecco quindi la mia versione modificata con supporto per cdata.

function SimpleXML2ArrayWithCDATASupport($xml){ 

    $array = (array)$xml; 

    if (count($array) == 0) { 
     $array = (string)$xml; 
    } 

    if (is_array($array)) { 
     //recursive Parser 
     foreach ($array as $key => $value){ 
      if (is_object($value)) { 
       if(strpos(get_class($value),"SimpleXML")!==false){ 
         $array[$key] = SimpleXML2ArrayWithCDATASupport($value); 
       } 
      } else { 
       $array[$key] = SimpleXML2ArrayWithCDATASupport($value); 
      } 
     } 
    } 

    return $array; 
} 
+1

Sembra che tu abbia dimenticato di rinominare le tue chiamate ricorsive nella funzione poiché la funzione è SimpleXML2ArrayWithCDATASupport ma la chiamata ricorsiva è SimpleXML2Array. – Loren

+0

@Loren grazie l'ho modificato :) –

+0

Ho trovato che 'json_encode' e' http_build_query' soffrono degli stessi identici sintomi, quindi questo approccio è il più affidabile. –

28

Questo dovrebbe funzionare:

$xml = simplexml_load_string($xmlstring); 
$json = json_encode($xml); 
$array = json_decode($json,TRUE); 
+0

Ho appena provato e funziona. Anche in modo ricorsivo, che è fantastico. Mi preoccupo di cosa accadrà in caso di un personaggio non UTF-8, però. I metodi 'json_encode' e' json_decode' tendono a soffocare quando incontrano un carattere non UTF-8. Avvolgere in un 'try ... catch 'sarebbe saggio, anche se non so se ci sarebbe un modo per gestirlo correttamente (cioè codificare in UTF-8) senza scrivere un parser personalizzato. –

+0

Sia 'json_encode' che' http_build_query' sembrano avere problemi di interpretazione dei tag '. Sembra che entrambe le funzioni determinino che siano oggetti vuoti, nel qual caso 'http_build_query' lo ignora completamente. –