2009-05-07 8 views

Antwort

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

schlau! Ich hätte nie gedacht, das zu tun. –

+3

Ich hätte dir, wenn möglich, 100 Upvotes gegeben. Es ist einfach genial :) –

+0

Clever noch lesbar, wartbar und elegant. – Eddified

6

Haben diese eine nicht testen, aber dies scheint es getan:

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

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

+0

Dies funktionierte nicht für mich –

+1

Nicht sicher, wie dies für andere "nicht funktioniert", aber es macht den Job der Iteration durch alle Kinder und Attribute. –

+0

es liest nicht CDATA – reggie

0

möglich ist Genommen. Dies ist eine rekursive Funktion, die die Tags der Elternelemente und die Tags + Inhalte der Elemente ausgibt, die keine Kinder mehr haben. Sie können es ändern, um ein Array zu bauen:

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

Ich kann nicht den Punkt sehen, da SimpleXMLObject ohnehin wie Arrays threated werden ...

Aber wenn Sie wirklich, dass benötigen, nur die Antwort von überprüfen Chassagnette von in this thread oder this post in einem Forum.

+2

Außer für die Situation, wenn Sie es in einer Sitzung speichern möchten, erhalten 'Serialisierung von' SimpleXMLElement 'ist nicht erlaubt', wenn ich das versuche. Daher ist das Umwandeln in ein Array nützlich –

+0

@GromBeestje: XML ist bereits serialisiert. Es gibt kein Problem, eine Zeichenfolge in einer Sitzung zu speichern :) – hakre

+0

Das Parsen der XML-Zeichenfolge bei jedem Laden des Skripts scheint ineffizient zu sein, daher halte ich es für sinnvoll, ein geparstes Formular zu speichern. –