将PHP数据结构转换为序列化的XML

问题描述:

我有以下数组。我甚至不确定该数组是否格式正确。我甚至不确定我的阵列是否正确。将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://*.com/questions/1397036/how-to-convert-array-to-simplexml) –

+0

这个问题不说清楚 - 你只是问数组是否有效,或者如何做一个XML转换? 在检查数组是有效的 - 我只是尝试var_dump($数据),并检查你得到输出后,第一个实例定义它。运行php -l 将显示是否存在解析错误,但不会对找到它有帮助。附:你发布的数组对象是有效的php –

+0

如何做xml转换请 –

试试下面的函数

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

它是一个递归函数很容易。您的基本数组包含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> 

希望这会有所帮助。

<?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