2009-05-07 21 views

risposta

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

intelligente! Non avrei mai pensato di farlo. –

+3

Ti avrei dato 100 upvotes se possibile. È semplicemente fantastico :) –

+0

Intelligente ma leggibile, manutenibile ed elegante. – Eddified

6

non prova questo, ma questo sembra avere fatto:

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

Tratto da http://www.codingforums.com/showthread.php?t=87283

+0

Questo non ha funzionato per me –

+1

Non so come questo "non funzioni" per gli altri, ma fa il lavoro di iterare attraverso tutti i bambini e gli attributi. –

+0

non legge CDATA – reggie

0

E 'possibile. Questa è una funzione ricorsiva che stampa i tag degli elementi parent e i tag + il contenuto degli elementi che non hanno più figli. È possibile modificare per costruire un array:

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

non vedo il punto dal SimpleXMLObject può essere filettate come gli array comunque ...

Ma se si ha realmente bisogno che, basta controllare la risposta di Chassagnette di in this thread o this post in un forum.

+2

Fatta eccezione per la situazione in cui si desidera archiviarlo in una sessione, ottenere 'Serializzazione di' SimpleXMLElement 'non è consentito' quando lo provo. Pertanto il casting su array è utile –

+0

@GromBeestje: l'XML è già serializzato. Non c'è alcun problema per memorizzare una stringa in una sessione :) – hakre

+0

L'analisi della stringa XML ogni volta che lo script viene caricato sembra inefficiente, quindi penso che abbia senso archiviare un modulo analizzato. –

Problemi correlati