2010-04-28 27 views
12

La variable $ d proviene de la función file_get_contents para una url.SimpleXMLElement a PHP Array

$answer = @new SimpleXMLElement($d); 

A continuación se muestra la salida de la print_r ($ respuesta):

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

¿Cómo puedo recuperar el valor de cada elemento y añadir a una matriz? no puede resolverlo.

Respuesta

9

La $ respuesta ya puede funcionar como una matriz. Usted puede hacer esto si quieres ponerlo en una matriz real,

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

No puedo iterar a través de un objeto SimpleXMLElement de la siguiente manera –

37

En este sencillo de fundición tipo de caso también funcionará:

$my_array = (array)$answer 
+0

Esto fue rápido y sencillo. ¡Trabajado como un encanto! ¡Gracias! – cbloss793

0

esta función analizar una recursiva xml simplexml al conjunto recursivo

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

Tengo un problema con esta función porque encasillar cada elemento secundario xml en una matriz puede ocasionar un problema cuando el texto se encuentra entre etiquetas CDATA. –

2

Tengo un problema con esta función porque el encasillado de cada elemento secundario xml en una matriz puede generar un problema cuando el texto se encuentra entre las etiquetas CDATA.

Lo solucioné comprobando si el resultado del encasillado a una matriz está vacío. Si es así, conviértalo en una cadena y obtendrás un resultado adecuado.

así que aquí está mi versión modificada con soporte para 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

Parece que olvidó cambiar el nombre de sus llamadas recursivas en la función, ya que la función es SimpleXML2ArrayWithCDATASupport pero la llamada recursiva es SimpleXML2Array. – Loren

+0

@Loren gracias a que lo edité :) –

+0

Encontré que 'json_encode' y' http_build_query' padecen exactamente los mismos síntomas, por lo que este enfoque es el más confiable. –

28

Esto debería funcionar:

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

Acabo de probar y esto funciona. Incluso lo hace recursivamente, lo cual es genial. Sin embargo, me preocupa lo que sucederá en el caso de un personaje que no sea UTF-8. Los métodos 'json_encode' y' json_decode' tienden a ahogarse cuando se encuentran con un carácter que no es UTF-8. Envolver un 'try ... catch' sería sabio, aunque no sé si habría una forma de manejarlo correctamente (es decir, codificar a UTF-8) sin escribir un analizador personalizado. –

+0

Tanto 'json_encode' como' http_build_query' parecen tener problemas para interpretar las etiquetas ''. Parece que ambas funciones determinan que sean objetos vacíos, en cuyo caso 'http_build_query' lo ignora por completo. –