递归地将PHP数组转换为XML?

时间:2014-11-24 17:01:58

标签: php arrays xml recursion simplexml

我正在开发一个RESTful API,以三种模式提供内容,即JSON [大部分时间],HTML [在进行非api调用时]和XML [传统支持]。

我的控制器返回PHP数组,然后在视图中,我将它们转换为所需的输出。 PHP到JSON是通过json_encode完成的,PHP到HTML是通过视图和模板引擎之间的消息传递完成的。现在,我正在编写一个递归函数来处理多维PHP数组并将它们转换为格式良好的XML。

以下是我的功能:

function recursive_xml($array, \SimpleXMLElement $xmlObj){
    foreach($array as $key=>$value){
        $xmlObj->addChild($key);
        if(!is_array($value)){
            $xmlObj->$key = $value;
        }
        else { //Value is array
            recursive_xml($value, $xmlObj->$key);
        }
    }
    header('Content-type: text/xml');
    echo $xmlObj->asXML();
} //End recursive_xml

这正如预期的那样工作了近80%,通过数组并创建XML输出。但有趣的问题是,在recursive_xml的第二次调用中,在之后,它会在XML解析之前将输出附加到XML和ALSO中。让我们来看一个测试用例:

$obj = new \SimpleXMLElement("<root />");
$array = array("a"=>"b", "c"=>"d", "e"=>array("x"=>"z", "y"=>"v")); 
recursive_xml($array, $obj);

现在输出:

 `<e><x>z</x><y>v</y></e><?xml version="1.0"?>
 <root><a>b</a><c>d</c><e><x>z</x><y>v</y></e></root>`

输出的第二行以及XML声明是我理想的选择。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我不会试图了解到底发生了什么。

但我可以告诉你,你的问题是你echo的号召。尝试以正确的方式从函数中返回SimpleXMLElement,并从函数外部asXML()echo返回它,它将按预期工作:)