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

时间:2016-08-28 10:57:17

标签: php arrays xml recursion serialization

我需要将以下输入数组转换为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>

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

任何帮助将不胜感激!

由于

1 个答案:

答案 0 :(得分:1)

这似乎有人将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>