数据序列化-将复杂数组转换为XML


Data Serialisation - Converting Complex Array into XML

我需要将以下输入数组转换为xml。

输入数组:

    $inputData = array (   
      'name' => 'xml',
      'attr' => array(
        'id' => 123
       ),
      'children' => array(
         array(
          'name' => 'name',
          'attr' => array(),
          'children' => array(
            'Vegi List'
          ),
       ),
       array(
        'name' => 'vegitables',
        'attr' => array(),
        'children' => array(
            array(
                'name' => "vegitable",
                'attr' => array(
                    'id' => 456
                ),
                'children' => array(
                    array(
                        'name' => "name",
                        'attr' => array(),
                        'children' => array(
                            "Spinach"
                        )
                    )
                )
            ),
            array(
                'name' => "vegitable",
                'attr' => array(
                    'id' => 789
                ),
                'children' => array(
                    array(
                        'name' => "name",
                        'attr' => array(),
                        'children' => array(
                            "Carrot"
                        )
                    )
                )
            )
        )
    )
)

);输出XML:

    <xml id="123456">
      <name>Vegi List</name>
        <vegitables>
          <vegitable id="5235632">
            <url>Spinach</url>
          </vegitables>
          <vegitables id="5235633">
           <url>Carrot</url>
          </vegitables>
        </vegitables>
     </xml>

我正在考虑使用递归函数,但由于它是复杂的数组,我不知道正确的方法来接近它。

任何帮助将不胜感激!

谢谢

这看起来像是有人将XML转换为特定的JSON格式,该格式保留了格式良好的XML(没有名称空间支持)的大多数节点信息。

您是对的,您将需要一个递归函数,但是XML格式并没有那么复杂。基本上,您有一个数组,它描述XML元素节点及其名称、属性和子节点。子节点是用于文本节点的字符串或用于元素节点定义的数组。

这种格式可以使用DOM轻松转换回XML。

function appendNode(DOMNode $parent, $nodeDefinition) {
  $document = $parent instanceOf DOMDocument ? $parent : $parent->ownerDocument; 
  if (is_string($nodeDefinition)) {
    // append string as text node
    $node = $parent->appendChild(
      $document->createTextNode($nodeDefinition)
    );
  } elseif (is_array($nodeDefinition)) {
    // append array as new element
    $node = $parent->appendChild(
      $document->createElement($nodeDefinition['name'])
    );
    foreach ($nodeDefinition['attr'] as $name => $value) {
      $node->setAttribute($name, $value);
    }
    foreach ($nodeDefinition['children'] as $childDefinition) {
      // iterate child definitions and append them
      appendNode($node, $childDefinition);
    }
  }
}
$document = new DOMDocument();
appendNode($document, $inputData);
$document->formatOutput = TRUE;
echo $document->saveXml();
输出:

<?xml version="1.0"?>
<xml id="123">
  <name>Vegi List</name>
  <vegitables>
    <vegitable id="456">
      <name>Spinach</name>
    </vegitable>
    <vegitable id="789">
      <name>Carrot</name>
    </vegitable>
  </vegitables>
</xml>