[英]Is there any way to convert json to xml in PHP?
有什么办法可以在PHP
中将json
转换为xml
吗? 我知道xml到json的可能性很大。
如果您愿意使用PEAR的XML序列化器 ,则可以通过两个简单的步骤将JSON转换为PHP对象,然后将PHP对象转换为XML:
include("XML/Serializer.php");
function json_to_xml($json) {
$serializer = new XML_Serializer();
$obj = json_decode($json);
if ($serializer->serialize($obj)) {
return $serializer->getSerializedData();
}
else {
return null;
}
}
这取决于您希望XML看起来如何。 我会尝试json_decode()
和PEAR::XML_Serializer
( 更多信息和sitepoint.com上的示例 )。
require_once 'XML/Serializer.php';
$data = json_decode($json, true)
// An array of serializer options
$serializer_options = array (
'addDecl' => TRUE,
'encoding' => 'ISO-8859-1',
'indent' => ' ',
'rootName' => 'json',
'mode' => 'simplexml'
);
$Serializer = &new XML_Serializer($serializer_options);
$status = $Serializer->serialize($data);
if (PEAR::isError($status)) die($status->getMessage());
echo '<pre>';
echo htmlspecialchars($Serializer->getSerializedData());
echo '</pre>';
(未经测试的代码-但您知道了)
使用json_decode
破解JSON,并遍历它以生成所需的XML。
如果您想知道,JSON和XML之间没有规范的映射,因此您必须根据应用程序的需要自己编写XML生成的代码。
我将前面的两个建议合并为:
/**
* Convert JSON to XML
* @param string - json
* @return string - XML
*/
function json_to_xml($json)
{
include_once("XML/Serializer.php");
$options = array (
'addDecl' => TRUE,
'encoding' => 'UTF-8',
'indent' => ' ',
'rootName' => 'json',
'mode' => 'simplexml'
);
$serializer = new XML_Serializer($options);
$obj = json_decode($json);
if ($serializer->serialize($obj)) {
return $serializer->getSerializedData();
} else {
return null;
}
}
本机方法可能是
function json_to_xml($obj){
$str = "";
if(is_null($obj))
return "<null/>";
elseif(is_array($obj)) {
//a list is a hash with 'simple' incremental keys
$is_list = array_keys($obj) == array_keys(array_values($obj));
if(!$is_list) {
$str.= "<hash>";
foreach($obj as $k=>$v)
$str.="<item key=\"$k\">".json_to_xml($v)."</item>".CRLF;
$str .= "</hash>";
} else {
$str.= "<list>";
foreach($obj as $v)
$str.="<item>".json_to_xml($v)."</item>".CRLF;
$str .= "</list>";
}
return $str;
} elseif(is_string($obj)) {
return htmlspecialchars($obj) != $obj ? "<![CDATA[$obj]]>" : $obj;
} elseif(is_scalar($obj))
return $obj;
else
throw new Exception("Unsupported type $obj");
}
另一个选择是使用JSON流解析器 。
如果要在使用json_decode
时绕过PHP创建的中间对象图,则使用流式分析器将很方便。 例如,当您有一个大的JSON文档并且存在内存问题时,可以在使用流解析器读取文档的同时直接使用XMLWriter
输出XML。
一个示例是https://github.com/salsify/jsonstreamingparser
$writer = new XMLWriter;
$xml->openURI('file.xml');
$listener = new JSON2XML($writer); // you need to write the JSON2XML listener
$stream = fopen('doc.json', 'r');
try {
$parser = new JsonStreamingParser_Parser($stream, $listener);
$parser->parse();
} catch (Exception $e) {
fclose($stream);
throw $e;
}
JSON2XML侦听器将需要实现Listener接口 :
interface JsonStreamingParser_Listener
{
public function start_document();
public function end_document();
public function start_object();
public function end_object();
public function start_array();
public function end_array();
public function key($key);
public function value($value);
}
在运行时,侦听器将从解析器接收各种事件,例如,当解析器找到一个对象时,它将把数据发送到start_object()
方法。 当找到一个数组时,它将触发start_array()
等等。 然后在这些方法中,将值委托给XMLWriter
的适当方法,例如start_element()
等等。
免责声明:我与作者无关,也从未使用过该工具。 我之所以选择这个库是因为该API看起来足够简单,可以说明如何使用基于事件的JSON解析器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.