2009-05-07 15 views

Respuesta

52
json_decode(json_encode((array) simplexml_load_string($obj)), 1); 
+0

listo! Nunca hubiera pensado hacer eso. –

+3

Te habría dado 100 votos ascendentes si es posible. Es simplemente increíble :) –

+0

Inteligente pero legible, fácil de mantener y elegante. – Eddified

6

no probó éste, pero esto parece lograr que se haga:

function convertXmlObjToArr($obj, &$arr) 
{ 
    $children = $obj->children(); 
    foreach ($children as $elementName => $node) 
    { 
     $nextIdx = count($arr); 
     $arr[$nextIdx] = array(); 
     $arr[$nextIdx]['@name'] = strtolower((string)$elementName); 
     $arr[$nextIdx]['@attributes'] = array(); 
     $attributes = $node->attributes(); 
     foreach ($attributes as $attributeName => $attributeValue) 
     { 
      $attribName = strtolower(trim((string)$attributeName)); 
      $attribVal = trim((string)$attributeValue); 
      $arr[$nextIdx]['@attributes'][$attribName] = $attribVal; 
     } 
     $text = (string)$node; 
     $text = trim($text); 
     if (strlen($text) > 0) 
     { 
      $arr[$nextIdx]['@text'] = $text; 
     } 
     $arr[$nextIdx]['@children'] = array(); 
     convertXmlObjToArr($node, $arr[$nextIdx]['@children']); 
    } 
    return; 
} 

Tomado de http://www.codingforums.com/showthread.php?t=87283

+0

esto no funcionó para mí –

+1

No estoy seguro de cómo este "no funciona" para los demás, pero hace el trabajo de iteración a través de todos los niños y atributos. –

+0

no lee CDATA – reggie

0

Es posible. Esta es una función recursiva que imprime las etiquetas de los elementos principales y las etiquetas + contenidos de los elementos que no tienen más hijos. Es posible realizar cambios para construir una matriz:

foreach($simpleXmlObject as $element) 
{ 
    recurse($element); 
} 

function recurse($parent) 
{ 
    echo '<' . $parent->getName() . '>' . "\n";  

    foreach($parent->children() as $child) 
    { 
     if(count($child->children()) > 0) 
     { 
      recurse($child); 
     } 
     else 
     { 
      echo'<' . $child->getName() . '>'; 
      echo iconv('UTF-8', 'ISO-8859-1', $child); 
      echo '</' . $child->getName() . '>' . "\n"; 
     } 
    } 

    echo'</' . $parent->getName() . '>' . "\n"; 
} 
0

no veo desde el punto SimpleXMLObject puede threated al igual que las matrices de todos modos ...

Pero si realmente es necesario que, simplemente marque la respuesta de Chassagnette de en this thread o this post en un foro.

+2

A excepción de la situación en la que desea almacenarlo en una sesión, obtener 'Serialización de' SimpleXMLElement 'no es permitido' cuando intento eso. Por lo tanto, fundir en matriz es útil –

+0

@GromBeestje: XML ya está serializado. No hay problema para almacenar una cadena en una sesión :) – hakre

+0

Analizar la cadena XML cada vez que se carga el script parece ineficiente, por lo tanto, creo que tiene sentido almacenar un formulario analizado. –