есть ли способ конвертировать json в xml в PHP? Я знаю, что xml to json очень возможен.
Если вы хотите использовать Сериализатор XML из PEAR, вы можете преобразовать 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; } }
в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>';
(Непроверенный код – но вы поняли)
Crack откройте JSON с помощью json_decode
и json_decode
его, чтобы генерировать любой 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-потокового анализатора .
Использование анализатора стримера пригодится, если вы хотите обойти граф промежуточных объектов, созданный PHP при использовании json_decode
. Например, когда вы получили большой документ JSON и память, это проблема, вы можете напрямую выводить XML с помощью XMLWriter
, читая документ с помощью потокового анализатора.
Например, 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 на основе событий.