2009-05-07 30 views

Trả lời

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

thông minh! Tôi đã không bao giờ nghĩ để làm điều đó. –

+3

Tôi đã cho bạn 100 phiếu bầu nếu có thể. Chỉ tuyệt vời của nó :) –

+0

Thông minh nhưng dễ đọc, dễ bảo trì và thanh lịch. – Eddified

6

Không kiểm tra thế này, nhưng điều này dường như làm cho nó thực hiện:

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

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

+0

Điều này không hiệu quả đối với tôi –

+1

Không chắc chắn cách này "không hoạt động" cho người khác, nhưng công việc lặp lại qua tất cả trẻ em và thuộc tính. –

+0

nó không đọc CDATA – reggie

0

Có thể. Đây là một hàm đệ quy in ra các thẻ của các phần tử cha và các thẻ + nội dung của các phần tử không có nhiều con. Bạn có thể thay đổi nó để xây dựng một mảng:

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

Tôi không nhìn thấy điểm từ SimpleXMLObject có thể được threated giống như mảng anyway ...

Nhưng nếu bạn thực sự cần điều đó, chỉ cần kiểm tra câu trả lời của chassagnette trong số this thread hoặc this post trong diễn đàn.

+2

Ngoại trừ trường hợp khi bạn muốn lưu trữ nó trong một phiên, nhận được 'Tuần tự hóa' SimpleXMLElement 'không phải là được phép' khi tôi thử điều đó. Do đó việc đúc thành mảng là hữu ích –

+0

@GromBeestje: XML đã được đăng. Không có vấn đề gì để lưu trữ một chuỗi trong một phiên :) – hakre

+0

Phân tích cú pháp chuỗi XML mỗi lần tải tập lệnh có vẻ không hiệu quả, do đó tôi nghĩ rằng lưu trữ một biểu mẫu được phân tích cú pháp có ý nghĩa. –