将PHP数据结构转换为串行化的XML


Convert a PHP data structure into serialised XML

我有以下数组。我甚至不确定这个数组的格式是否正确。我甚至不确定我的阵列是否正确。

我想使用PHP将以下数组转换为序列化的XML。我正在使用属性标签。

这是阵列:

$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'
                        )
                    )
                )
            )
        )
    )
)
);

使用递归函数非常容易。您的基本数组包含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>

尝试以下函数

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

在这里测试

希望这会有所帮助。

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