2009-05-07 7 views

Odpowiedz

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

sprytny! Nigdy bym tego nie pomyślał. –

+3

W miarę możliwości dałbym ci 100 przegranych. To po prostu niesamowite :) –

+0

Sprytne, ale czytelne, do utrzymania i eleganckie. – Eddified

6

nie testowałem ten jeden, ale wydaje się to zrobić to:

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

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

+0

ta nie działa dla mnie –

+1

Nie wiem, jak to „nie działa” dla innych, ale ma za zadanie iteracja wszystkich dzieci i atrybutów. –

+0

Nie czyta CDATA – reggie

0

To jest możliwe. Jest to funkcja rekursywna, która wypisuje tagi elementów nadrzędnych oraz znaczniki + zawartość elementów, które nie mają więcej dzieci. Możesz zmienić ją zbudować tablicę:

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

ja nie widzę sensu, ponieważ SimpleXMLObject można Threated podobnie jak tablice w każdym razie ...

Ale jeśli naprawdę potrzebujesz, że po prostu sprawdzić odpowiedź chassagnette za z this thread lub this post na forum.

+2

Z wyjątkiem sytuacji, gdy chcesz przechowywać go w sesji, uzyskanie "Serializacji" SimpleXMLElement "nie jest dozwolone " kiedy próbuję tego. Dlatego przesyłanie do tablicy jest użyteczne –

+0

@GromBeestje: XML jest już serializowany. Nie ma problemu z zapisaniem ciągu znaków w sesji :) – hakre

+0

Analizowanie łańcucha XML za każdym razem, gdy ładuje się skrypt, wydaje się nieefektywne, dlatego myślę, że sensowne jest przechowywanie przeanalizowanego formularza. –