Есть ли способ конвертировать json в xml в PHP? Я знаю, что xml для json очень возможно.
Есть ли способ конвертировать json в xml в PHP?
Ответ 1
Если вы хотите использовать XML Serializer из 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;
}
}
Ответ 2
Это зависит от того, как именно вы хотите, чтобы 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>';
(Неподтвержденный код - но вы поняли идею)
Ответ 3
Crack откройте JSON с помощью json_decode
и перейдите к нему, чтобы генерировать любой XML файл, который вы хотите.
Если вам интересно, канонического сопоставления между JSON и XML не существует, поэтому вам нужно написать код генерации XML самостоятельно, исходя из потребностей вашего приложения.
Ответ 4
Я объединил два предыдущих предложения в:
/**
* 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;
}
}
Ответ 5
Нативный способ может быть
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");
}
Ответ 6
Другим вариантом будет использование 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 необходимо реализовать интерфейс прослушивателя:
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 на основе событий.