有没有办法将json转换为PHP中的xml?
有什么方法可以在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>';
(未经testing的代码 – 但你明白了)
用json_decode
打开JSON,并遍历它来生成任何你想要的XML。
如果您想知道,JSON和XML之间没有规范的映射,所以您必须根据应用程序的需要自己编写XML代码。
我把这两个早期的build议结合起来:
/** * 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"); }
另一种select是使用JSONstreamparsing器 。
如果你想绕过PHP使用json_decode
创build的中间对象图,使用json_decode
分析器会派上用场。 例如,当你得到一个大的JSON文档和内存是一个问题时,你可以直接用XMLWriter
输出XML,而用streamparsing器读取文档。
一个例子是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监听器需要实现监听器接口 :
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); }
在运行时,监听器将从parsing器接收各种事件,例如当parsing器发现一个对象时,它将把数据发送到start_object()
方法。 当它find一个数组时,它会触发start_array()
等等。 在这些方法中,您可以将这些值委托给XMLWriter
适当的方法,例如start_element()
等等。
免责声明:我不隶属于作者,也没有使用过此工具。 我select了这个库是因为API看起来非常简单,可以说明如何使用基于事件的JSONparsing器。