2016-05-15 92 views
0

我有以下數組。我甚至不確定該數組是否格式正確。我甚至不確定我的陣列是否正確。將PHP數據結構轉換爲序列化的XML

我想將下列數組轉換爲使用PHP的序列化XML。我正在使用屬性的attr標籤。

這裏是數組:

$data = Array(
'name' => 'account', 
'attr' => Array(
    'id' => 123456 
), 
'children' => Array(
    Array(
     'name' => 'name', 
     'attr' => Array(), 
     'children' => Array(
      'BBC' 
     ), 
    ), 
    Array(
     'name' => 'monitors', 
      'attr' => Array(), 
     'children' => Array(
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235632 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/' 
         ) 
        ) 
       ) 
      ), 
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235633 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/news' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 
); 
+0

的可能的複製[如何數組轉換爲SimpleXML的(http://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml) –

+0

這個問題不說清楚 - 你只是問數組是否有效,或者如何做一個XML轉換? 在檢查數組是有效的 - 我只是嘗試var_dump($數據),並檢查你得到輸出後,第一個實例定義它。運行php -l 將顯示是否存在解析錯誤,但不會對找到它有幫助。附:你發佈的數組對象是有效的php –

+0

如何做xml轉換請 –

回答

1

試試下面的函數

function assocArrayToXML($root_element_name,$ar) 
{ 
    $xml = new SimpleXMLElement("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>"); 
    $f = function($f,$c,$a) { 
      foreach($a as $k=>$v) { 
       if(is_array($v)) { 
        $ch=$c->addChild($k); 
        $f($f,$ch,$v); 
       } else { 
        $c->addChild($k,$v); 
       } 
      } 
    }; 
    $f($f,$xml,$ar); 
    return $xml->asXML(); 
} 


echo assocArrayToXML("root",$data); 

test it here

+0

不要使用'create_function()'它是一個隱藏的'eval()'。使用[匿名函數](http://www.php.net/manual/en/functions.anonymous.php)。 – ThW

+0

@ThW您可以刪除倒票,這可能只是作爲註釋被要求 –

+0

您的方法的輸出仍然是XML的破碎。你有數字標籤名稱。 *順便說一句*嘗試使用它帶有'&'的網址。 – ThW

1

它是一個遞歸函數很容易。您的基本數組包含3個元素,名稱,屬性列表和子元素。所以你的函數必須創建並附加一個名稱的節點,設置所有屬性並迭代子數據。如果孩子是一個標量,它是一個文本節點,因爲數組調用函數本身。

function appendTo($parent, $data) { 
    $document = $parent->ownerDocument ?: $parent; 
    $node = $parent->appendChild($document->createElement($data['name'])); 
    if (isset($data['attr']) && is_array($data['attr'])) { 
    foreach ($data['attr'] as $name => $value) { 
     $node->setAttribute($name, $value); 
    } 
    } 
    if (isset($data['children']) && is_array($data['children'])) { 
    foreach ($data['children'] as $name => $childData) { 
     if (is_scalar($childData)) { 
     $node->appendChild($document->createTextNode($childData)); 
     } elseif (is_array($childData)) { 
     appendTo($node, $childData); 
     } 
    } 
    } 
} 

$document = new DOMDocument(); 
$document->formatOutput = TRUE; 
appendTo($document, $data); 

echo $document->saveXml(); 

輸出:

<?xml version="1.0"?> 
<account id="123456"> 
    <name>BBC</name> 
    <monitors> 
    <monitor id="5235632"> 
     <url>http://www.bbc.co.uk/</url> 
    </monitor> 
    <monitor id="5235633"> 
     <url>http://www.bbc.co.uk/news</url> 
    </monitor> 
    </monitors> 
</account> 
0

希望這會有所幫助。

<?php 
function array2xml($arr) 
{ 
    $dom = new DomDocument('1.0'); 
    /* 
    *Create Root 
    */ 
    $root = $dom->createElement($arr['name']); 
    if(isset($arr['attr']) && !empty($arr['attr'])) 
    { 
     foreach($arr['attr'] as $key=>$val) 
     $root->setAttribute($key, $val); 
    } 
    $root = $dom->appendChild($root); 
    createChilds($arr['children'], $dom, $root); 

    header('Content-type: text/xml'); 
    echo $dom->saveXML(); 
} 
function createChilds($arr, $dom, $parent) 
{ 
    foreach($arr as $child) 
    { 
     if(isset($child['name'])) 
      $node = $dom->createElement($child['name']); 
     /* 
     *Add Attributes 
     */ 
     if(isset($child['attr']) && !empty($child['attr'])) 
     { 
      foreach($child['attr'] as $key=>$val) 
      $node->setAttribute($key, $val); 
     } 
     /* 
     *Add Childs Recursively 
     */  
     if(isset($child['children']) && is_array($child['children'])) 
     { 
      createChilds($child['children'], $dom, $node); 
     } 
     else if(isset($child) && is_string($child)) 
     { 
      $text = $dom->createTextNode($child); 
      $parent->appendChild($text); 
     } 
     if(isset($node)) 
     $parent->appendChild($node); 
    } 
} 

$data = Array(
'name' => 'account', 
'attr' => Array(
    'id' => 123456 
), 
'children' => Array(
    Array(
     'name' => 'name', 
     'attr' => Array(), 
     'children' => Array(
      'BBC' 
     ), 
    ), 
    Array(
     'name' => 'monitors', 
      'attr' => Array(), 
     'children' => Array(
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235632 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/' 
         ) 
        ) 
       ) 
      ), 
      Array(
       'name' => 'monitor', 
       'attr' => Array(
        'id' => 5235633 
       ), 
       'children' => Array(
        Array(
         'name' => 'url', 
         'attr' => Array(), 
         'children' => Array(
          'http://www.bbc.co.uk/news' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 
); 
array2xml($data); 
?> 
+0

解釋在哪裏?請添加一些觀點或評論,以使您的代碼不言自明。 – surajsn

相關問題