我正在开发一个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声明是我理想的选择。任何帮助将不胜感激!
答案 0 :(得分:1)
我不会试图了解到底发生了什么。
但我可以告诉你,你的问题是你echo
的号召。尝试以正确的方式从函数中返回SimpleXMLElement,并从函数外部asXML()
和echo
返回它,它将按预期工作:)